2014-05-06 46 views
2

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

任何想法来解决这一点?

谢谢

乔治

+0

您正在使用哪个Ruby版本? –

+0

我使用Ruby版本2.0(通过Windows:2.0.0p195) –

+1

好吧 - 只要您使用的是旧版本的Ruby,在某些情况下超时时间不可靠的情况下,您可能会遇到很多困难。 –

回答

0

从我推测,指定read_timeout读操作时,会立即返回(非阻塞)的文档,从而从未引起Timeout::Error如你所愿。

你可以尝试设置超时0,根据文档将阻塞,直到一个字节可用,看看是否会提高Timeout::Error

或尝试设置没有超时,看看是否有效。

或者,您可以指定一个负超时,该超时立即返回任何可用数据并根据该超时做出决定。

+0

谢谢Rkon!明天我会在你正确的建议下做更多的测试,并且你会在这里反馈 –

0

对不起回答我自己的问题,只是分享一些测试,也是继rkhon建议:

前提: 现在我测试使用Ruby 2。0在Windows 7安装到使用USB连接PC机爱普生TM-T20打印机(和一个串行端口 - USB爱普生“匹配”)

关于的SerialPort(读取)超时测试:

如果我设置:
printer.read_timeout <= 0

的SerialPort读杭(不返回控制)

如果我设置: printer.read_timeout > 0

# read 1 byte 
printer.read(1) 

如果读取缓冲区中不存在AVAILABLE字节,则在read_timeout毫秒后返回,否则立即返回读取的字节。 Thta还好!

顺便说一句,它似乎是serialport gem超时运行与优先(WINs)对Ruby语言超时支持;这意味着,如果我设置一个printer.read_timeout = 2000后来我做

# 1000 msecs 
Timeout.timeout(1) do 
    puts printer.read 
    end 

但我得到了控制后2000毫秒背...

管理错误/连接状态:即使 我不能使用如果我发送(写入)打印机的DLE EOT m(STATUS请求),那么我可以检查打印机的电源开启/连接状态,但没有明确的超时异常...

我回来了(读)没有数据(无)

希望报告可能会有用...