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

时间:2012-04-15 11:46:49

标签: ruby-on-rails ruby ruby-on-rails-3 serial-port arduino

我正在使用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

2 个答案:

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