我正在开发一个多平台Ruby程序,它应该通过USB连接到串行设备。 首先我使用的是serialport gem(1.0.4),但后来我遇到了一些奇怪的问题,不得不放弃它。 然后我继续通过Ruby的IO类进行通信,如下所示:
@port = IO.new IO.sysopen(path, mode), mode
通过syswrite和sysread进行通信在Linux和Windows中都是完美的。
完成通信后,我尝试设置超时,以便在发生任何异步时程序不会挂起。所有这些都是在Linux端使用timeout.rb完成的,但在调用任何IO读取方法后,Windows都不会让我再次控制解释器(sysread,getc,gets,getbyte ......我全都试过了!)。
我尝试使用终结者,但它甚至不会运行,抛出参数异常而不是超时 - 即使在Linux中!:
require 'terminator'
Terminator.terminate 2 do
sleep 4
end
产生
/var/lib/gems/1.9.1/gems/terminator-0.4.4/lib/terminator.rb:164: Use RbConfig instead of obsolete and deprecated Config.
ArgumentError: wrong number of arguments (1 for 0)
from /var/lib/gems/1.9.1/gems/terminator-0.4.4/lib/terminator.rb:127:in `block in terminate'
from (irb):12:in `call'
from (irb):12:in `sleep'
from (irb):12:in `block in irb_binding'
from /var/lib/gems/1.9.1/gems/terminator-0.4.4/lib/terminator.rb:134:in `call'
from /var/lib/gems/1.9.1/gems/terminator-0.4.4/lib/terminator.rb:134:in `terminate'
from (irb):11
from /usr/bin/irb:12:in `<main>'
由于SystemTimer依赖于UNIX信号并且在Windows上不起作用(它只是包装了timeout.rb),所以我遇到了一个多平台程序,它在Windows上运行时会永久挂起,尽管在Linux上运行得很好。
有没有办法在Windows上串口读取时设置超时?也许是win32api的电话?
感谢您的时间。 :)
修改
我相信我找到了解决问题的方法,虽然它真的很臭。
而不是
Timeout::timeout 0.5 do
gets
end
我试过
begin
Timeout::timeout 0.5 do
Thread.new do
gets
end.join
end
rescue
"Expired :)"
end
在IRB上似乎没问题。
我要实现并测试它然后我会在这里发布结果。 :)
然而,任何更漂亮的解决方案都非常受欢迎!