使用pyserial的超时值在Windows上不起作用

时间:2013-01-09 13:33:12

标签: python windows timeout pyserial

我在64位Windows 7计算机上运行Python 2.7.3,并且它(通过USB-> RS232电缆)连接到运行相同Python版本(2.7.3)的64位Ubuntu计算机。

我遇到了一个问题,其中超时=无在Windows 7方面似乎无法正常工作,我无法弄清楚原因。

这就是我在胜利方面所拥有的:

>>> import serial
>>> s = serial.Serial(3)
>>> s.baudrate = 9600
>>> s
Serial<id=0x203a320, open=True>(port='COM4', baudrate=9600, bytesize=8, parity='N',
stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
>>> s.read(5)
''                  <--- returns right away
>>> s.timeout = 0
>>> s.read(5)
''                  <--- correctly returns right away
>>> s.timeout = 10
>>> s.read(5)       <--- correctly waits 10s

现在我已经阅读了文档here,我知道如果我没有超时None它应该永远等待,并且0超时它应该立即返回,但是None是默认值,它不会等待...我想知道是否有什么变化,但是当我在Linux端尝试代码时,它可以工作:

>>> import serial
>>> s = serial.Serial("/dev/ttyUSB0")
>>> s.baudrate = 9600
>>> s
Serial<id=0x7f325e002b50, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, 
parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
>>> s.read(5)
''                  <--- correctly waits forever
>>> s.timeout = 0
>>> s.read(5)
''                  <--- correctly returns right away
>>> s.timeout = 10
>>> s.read(5)       <--- correctly waits 10s

在Windows上进行此设置时是否有任何已知的警告?有谁有想法为什么我看到这个问题?关于其他事情的任何想法,我可以尝试帮助诊断这种失败?

2 个答案:

答案 0 :(得分:0)

在Windows 7 x64上使用python 2.7.3和pyserial 2.6,它可以正常工作:

>>> import serial
>>> s = serial.Serial(1)
>>> Serial<id=0x3ea5518, open=True>(port='COM2', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
>>> s.read(5)
# ... after receiving real data ... 
'\xb99\xad\x87\xc2'

你使用什么版本的PySerial? 我已经通过Christoph Gohlke 1从非官方的Windows二进制文件中为Python扩展包编译了二进制文件。 也许你应该试试这个。

答案 1 :(得分:0)

我在Raspberry Pi上遇到了同样的问题。值得注意的是USB-RS232电缆!这似乎与纯RS232接口有不同的行为。当您从端口读取n字节时,它将始终返回n“0”字节,尽管没有可用的数据。特别是它将填充一个读取请求,该请求不仅仅要求上述“0”字节的等待承诺。唯一的方法是使用in_waiting并只读取属性承诺的字节数。