从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调制解调器。 也许你的设备正在等待一些命令。