5

我正在使用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_timeout0,阅读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
4

2 回答 2

2

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

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

于 2012-09-06T19:38:17.120 回答
0

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

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

在这种情况下,我使用的是 GSM 调制解调器。也许您的设备首先在等待某个命令。

于 2012-05-10T12:52:07.723 回答