2012-04-15 11 views
5

Sto utilizzando la serialportgem a leggere dalla porta seriale nel mio Ruby on Rails 3.2 dell'applicazione. La stessa porta seriale viene utilizzata per scrivere dati da una scheda Arduino. La gemma viene aggiunta a Gemfile. La porta viene inizializzato in application.rb:lettura dalla porta seriale in un'applicazione Ruby on Rails pende

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

Il problema si presenta quando si tenta di leggere da questa porta.

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

L'applicazione è micidiale. Ho provato ad eseguire la lettura da una sessione pry e tutto era OK. Se si imposta read_timeout su 0, la lettura da pry si blocca anche. Ho già provato a impostare read_timeout su valori più grandi senza risultati. Cosa dovrei fare per farlo funzionare?

Aggiornamento:

ho cercato di eseguire le stesse azioni con sinatraframework. Si blocca anche.

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 

risposta

0

Potete intereact con il dispositivo utilizzando un semplice script, in questo modo:

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

In questo caso ho usato un modem GSM. Forse il tuo dispositivo è in attesa di qualche comando per primo.

2

Aveva lo stesso problema. La soluzione era in realtà facile, il problema è che la tua app di rotaia legge costantemente nuovi valori dalla porta seriale e finché legge quegli input, non fa altro, quindi il tuo sito non sarà mai realmente costruito.

Provare se funziona se ad esempio si lascia semplicemente leggere dalla porta seriale un numero fisso di volte.