4

编辑

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

此行下方的原始问题

我在软件之间有一个串行桥接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)块中,但从长远来看,这似乎是一个糟糕的解决方案。

4

2 回答 2

3

线索在错误信息中[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] 精心设计的错误信息?那是新的!

于 2013-08-19T13:11:48.853 回答
1

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

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

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

我可以使用另一种解决方案来使用 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

于 2020-10-31T15:47:12.933 回答