【发布时间】:2014-06-22 18:40:49
【问题描述】:
我正在使用SerialPort Ruby gem 使用Ruby 脚本“驱动程序”从串行端口写入和读取。
我想从 Windows 和 Linux 操作系统运行应用程序; 顺便说一句,下面的代码已经在 Windows 7 上测试过。
具体来说,我必须在热敏打印机上打印 ESC/POS 文本数据, 通过串行线(COM/USB 端口)连接到主机。
我在打印机上写入数据没有任何问题(极好的廉价 Epson TM-T20)!
但我必须管理错误/连接状态读取设备中的数据,
通过示例查看打印机是否开机(在线),我会使用一些 ESC/POS commnads 向打印机设备询问打印机状态。
出现问题的原因是,即使我设置了串行端口超时(我的意思是设置 SerialPort 类初始化程序的超时参数),但没有异常处理,gem 似乎没有预见到这一点:-(,我无法理解是否打印机处于活动状态或已关闭。查看代码块:
begin
printer = SerialPort.new PRINTER_SERIALPORT_NAME, BAUDRATE
# http://curiosity.roguepenguin.net/?p=35
# timeouts are in milliseconds
printer.read_timeout = 2000
printer.write_timeout = 2000
puts "Success for SerialPort: #{ printer.inspect }"
rescue => e
puts "Failed to open as SerialPort: #{ e.inspect }"
end
使用上面的代码,printer.read 实际上会在 2000 毫秒后退出 .. 但我不知道是因为我返回的 (0) 字节数少于预期.. 还是因为设备已关机..
所以,我尝试使用 Ruby Timeout (http://ruby-doc.org/stdlib-2.0.0/libdoc/timeout/rdoc/Timeout.html),从 Winows 7 shell 运行脚本,但不幸的是下面的代码没有按预期运行(如果打印机关闭,printer.read HANG,我的意思是这样做根本不退出:-(,而且我没有预期的Timeout::Error);不是吗?
begin
Timeout.timeout(2) do
puts printer.read
end
rescue Timeout::Error
puts "SerialPort timeout."
rescue => e
puts "Serialport ERROR: Failed to open: #{ e.inspect }"
end
有什么办法解决这个问题吗?
谢谢
乔治
【问题讨论】:
-
您使用的是哪个 Ruby 版本?
-
我使用 Ruby 2.0 版(在 Windows 上:2.0.0p195)
-
好吧 - 如果您使用的是旧版 Ruby,在某些情况下超时不可靠,这只是一个长镜头。
-
是的,我会使用 Ruby 版本 >= 2.0
标签: ruby serial-port timeout usb thermal-printer