2012-04-15 23 views
5

Estoy usando el serialportgem para leer desde el puerto serie en mi aplicación Ruby on Rails 3.2. El puerto serie en sí se utiliza para escribir datos de una placa Arduino. La gema se agrega a Gemfile. El puerto se inicializa en application.rb:La lectura desde el puerto serie en una aplicación de Ruby on Rails se cuelga

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

El problema aparece cuando trato de leer desde este puerto.

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

La aplicación se cuelga mortalmente. Intenté leer desde una sesión pry y todo estaba bien. Si configuro read_timeout en 0, también se cuelga la lectura de pry. Ya traté de establecer read_timeout a valores más grandes sin resultado. ¿Qué debo hacer para que funcione?

Actualización:

he tratado de realizar las mismas acciones utilizando sinatraframework. Se cuelga también.

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 

Respuesta

0

¿Puede intereact el dispositivo mediante un simple script, así:

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

En este caso yo estaba usando un módem GSM. Tal vez su dispositivo está esperando algún comando primero.

2

Tenía el mismo problema. La solución fue realmente fácil, el problema es que la aplicación de sus raíles está leyendo constantemente nuevos valores del puerto serie y mientras lee esas entradas, no hace nada más, por lo que su sitio nunca se construirá realmente.

Intente si funciona si, por ejemplo, simplemente deje que se lea desde el puerto serie una cantidad fija de veces.

Cuestiones relacionadas