修改
我发现了问题所在,并回答了我自己的问题。
此行下方的原始问题
我在软件中实现了COM4
和COM5
之间的串行桥接(具体来说,就是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)
块中,但从长远来看这似乎是一个糟糕的解决方案。
答案 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