从Ruby on Rails应用程序中的串行端口读取挂起

我正在使用serialport gem从我的Ruby on Rails 3.2应用程序中的串口读取。 串行端口本身用于从Arduino板写入数据。 gem被添加到Gemfile 。 端口在application.rb初始化:

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

当我尝试从此端口读取时出现问题。

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

该应用程序挂起致命。 我试图从pry会话中进行阅读,一切都很好。 如果我将read_timeout设置为0 ,则从pry读取也会挂起。 我已经尝试将read_timeout设置为更大的值而没有结果。 我该怎么做才能让它发挥作用?

更新:

我试图使用sinatra 框架执行相同的操作。 它也挂了。

 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 

有同样的问题。 修复实际上很简单,问题是你的rails应用程序不断从串口读取新的值,只要它读取这些输入,它就不会做任何其他事情,所以你的网站永远不会真正构建。

尝试是否有效,例如,您只是让它从串行端口读取固定次数。

您可以使用简单的脚本与设备进行交互,如下所示:

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

在这种情况下,我使用的是GSM调制解调器。 也许你的设备正在等待一些命令。