Ruby + Windows + Timeouts + SerialPorts不起作用

时间:2012-05-03 15:08:45

标签: ruby windows timeout serial-port

我正在开发一个多平台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上似乎没问题。

我要实现并测试它然后我会在这里发布结果。 :)

然而,任何更漂亮的解决方案都非常受欢迎!

0 个答案:

没有答案