PySerial write()即时超时

时间:2013-08-19 11:47:42

标签: python pyserial

修改

我发现了问题所在,并回答了我自己的问题。

此行下方的原始问题

我在软件中实现了COM4COM5之间的串行桥接(具体来说,就是HDD的免费虚拟串行配置实用程序)

我有两个不同的python脚本在两个不同的Powershell实例中启动,首先接收:

import serial
receive = serial.Serial(port = 'COM5', baudrate = 9600)
text = receive.read(100)
receive.close()
print text

然后是发件人:

import serial
send = serial.Serial(port = 'COM4', baudrate = 9600, timeout = 0)
send.write("Hello")
send.close()

启动发件人脚本时,接收者脚本会收到已发送的消息(因此通信已明确建立),但发件人脚本会立即以错误结束:

Traceback (most recent call last):
  File ".\sending.py", line 3, in <module>
    send.writelines("Hello")
  File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 270, in write
    raise writeTimeoutError
serial.serialutil.SerialTimeoutException: Write timeout

将发件人脚本更改为

时出现同样的错误
send = serial.Serial(port = 'COM4', baudrate = 9600)

所以我的问题是:什么是超时?我该如何防止这种情况发生?我的意思是,数据被发送所以我可能只是将整个事情放在try/except(and do nothing)块中,但从长远来看这似乎是一个糟糕的解决方案。

2 个答案:

答案 0 :(得分:2)

线索在错误消息[1]

File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 270, in write
raise writeTimeoutError

所以我们打开该文件并找到:

if self._writeTimeout != 0: # if blocking (None) or w/ write timeout (>0)
            # Wait for the write to complete.
            #~ win32.WaitForSingleObject(self._overlappedWrite.hEvent, win32.INFINITE)
            err = win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True)
            if n.value != len(data):
                raise writeTimeoutError

再次阅读第一个条件:

if self._writeTimeout != 0:

所以让我们从之前重写代码

send = serial.Serial(port = 'COM4', baudrate = 9600, timeout = 0)

变为

send = serial.Serial(port = 'COM4', baudrate = 9600, writeTimeout = 0)

和Et Voila:没有例外。

[1]精心设计的错误消息?那是新的!

答案 1 :(得分:0)

问题可能是接口试图符合RTS,CTS,DSR或DTS信号。如果未正确虚拟连接它们,则可能会通过超时神秘地影响通信。

我还建议查看使用的虚拟串行网桥的配置。

一种解决方案可能是在Python中打开串行端口时忽略使用rtscts=False和/或dsrdtr=False的影响。

我可以使用另一种解决方案来使用hub4com进行嗅探通信,例如,我以这种方式使用了参数--octs = off,但是必须在之前正确创建虚拟端口。 hub4com --baud=115200 --route=0:All --route=1:All --route=2:All --no-default-fc-route=All:All --octs=off \\.\COM1 \\.\CNCB0 \\.\CNCB1