2012-04-15 8 views
5

Używam serialportgem do odczytu z portu szeregowego w mojej aplikacji Ruby on Rails 3.2. Sam port szeregowy służy do zapisu danych z tablicy Arduino. Klejnot jest dodawany do Gemfile. Port jest inicjowany w application.rb:Odczytywanie z portu szeregowego w aplikacji Ruby on Rails wisi

config.serial_port = SerialPort.new "/devttyACM0", 9600 
config.serial_port.read_timeout = 100 

Problem pojawia się przy próbie odczytu z tego portu.

@sp = ProjectName::Application::config.serial_port 
@sp.read 

Aplikacja zawiesza się śmiercionośna. Próbowałem wykonać odczyt z sesji pry i wszystko było w porządku. Jeśli ustawię read_timeout na 0, również zawiedzie czytanie z pry. Próbowałem już ustawić read_timeout na większe wartości bez rezultatu. Co powinienem zrobić, aby działało?

Aktualizacja:

Starałem się wykonać te same czynności przy użyciu sinatraframework. Wisi też.

require "sinatra" 
require "serialport" 

get '/' do 
    read_data 
end 

helpers do 
    def read_data 
    sp = SerialPort.new "/dev/ttyACM0", 9600 
    sp.read_timeout = 1500 
    t = sp.read.match(/\d+(\n|\r)+/)[0].gsub!(/(\n|\r)*/,"") rescue nil 
    sp.close 
    t 
    end 
end 

Odpowiedz

0

można intereact z urządzeniem za pomocą prostego skryptu, tak:

require 'rubygems' 
require 'serialport' 
sp = SerialPort.new "/dev/ttyUSB0" 
sp.write "AT\r" 
while true do 
    printf("%c", sp.getc) 
end 

W tym przypadku byłem za pomocą modemu GSM. Może twoje urządzenie najpierw czeka na jakieś polecenie.

2

Miał ten sam problem. Naprawienie problemu było proste, problemem jest to, że twoja aplikacja rails ciągle odczytywała nowe wartości z portu szeregowego i tak długo, jak długo czyta te wejścia, nie robi nic innego, więc twoja strona nigdy nie zostanie zbudowana.

Spróbuj, jeśli to działa, na przykład po prostu pozwól mu odczytywać z portu szeregowego określoną liczbę razy.