我正在使用http://ruby-serialport.rubyforge.org/ Ruby gem使用Ruby脚本“驱动程序”来写入和读取串行端口。Ruby串行端口超时异常
我想从Windows和Linux操作系统中运行应用程序;顺便说一句 ,这里下面的代码已在Windows 7
测试具体来说,我必须打印的热敏打印机上ESC/POS文本数据, 连接到主机计算机与一个串行线(COM/USB端口)。
我没有任何问题在打印机上打印数据(一流的&便宜的爱普生TM-T20)!
但我必须从设备管理错误/连接状态的读取数据,
通过例子来看看是否通电(上线)的打印机我会问打印机状态与某些打印机设备ESC/POS commnads。
问题出现是因为即使我设置串口超时(我的意思是SerialPort类初始化程序的settimg超时参数),没有异常处理,这似乎没有被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超时(http://ruby-doc.org/stdlib-2.0.0/libdoc/timeout/rdoc/Timeout.html),从Winows 7 shell运行脚本,但不幸的是下面的代码不能按预期运行(如果打印机关闭,我的意思是根本不会退出:-(,并且我没有预期的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,在某些情况下超时时间不可靠的情况下,您可能会遇到很多困难。 –