我正在使用serialport
gem从Ruby on Rails 3.2应用程序中的串口读取。串行端口本身用于从Arduino板写入数据。
宝石被添加到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
framework执行相同的操作。它也挂了。
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
答案 0 :(得分:2)
有同样的问题。修复实际上很简单,问题是你的rails应用程序不断从串口读取新值,只要它读取这些输入,它就不会做任何其他事情,所以你的网站永远不会真正构建。< / p>
尝试是否有效,例如,您只是让它从串口读取固定次数。
答案 1 :(得分:0)
您是否可以使用简单的脚本与设备进行交互,如下所示:
require 'rubygems'
require 'serialport'
sp = SerialPort.new "/dev/ttyUSB0"
sp.write "AT\r"
while true do
printf("%c", sp.getc)
end
在这种情况下,我使用的是GSM调制解调器。也许你的设备正在等待一些命令。