Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySerial write()即时超时_Python_Pyserial - Fatal编程技术网

Python PySerial write()即时超时

Python PySerial write()即时超时,python,pyserial,Python,Pyserial,编辑 我发现了问题所在,并回答了我自己的问题 此行下方的原始问题 我在软件中实现的COM4和COM5之间有一个串行桥接器(特别是HDD的免费虚拟串行配置实用程序) 我在Powershell的两个不同实例中启动了两个不同的python脚本,receive first: import serial receive = serial.Serial(port = 'COM5', baudrate = 9600) text = receive.read(100) receive.close() print

编辑

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

此行下方的原始问题

我在软件中实现的
COM4
COM5
之间有一个串行桥接器(特别是HDD的免费虚拟串行配置实用程序)

我在Powershell的两个不同实例中启动了两个不同的python脚本,receive first:

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

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

线索在错误消息中[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)
瞧,也不例外


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

问题可能是接口试图遵守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默认fc route=All:All--octs=off\\\.\COM1\.\CNCB0\.\CNCB1

可能是软件网桥中的错误,我在硬件端口COM或USB-COM上没有看到此异常。在异常上传递(不做任何事情)是不好的,因为你有超时,这会降低传输速度。实际上,从我发布到现在,我想我发现了一个问题-pyserial似乎只在32位体系结构下工作(至少在windows平台上)-serialwin32.py文件是一个提示,有人能确认一下吗?我刚刚遇到了FTDI USB/RS-232网桥的问题。驱动程序似乎可以防止进程被终止(脚本在异常情况下停止,python无法终止,CMD未关闭),只有拉动设备(小心BSOD)才能让事情重新开始。这可能是另一回事-最近的FTDI驱动程序更新使用了大量USB/RS-232芯片。我建议将来与其他供应商合作。
send = serial.Serial(port = 'COM4', baudrate = 9600, writeTimeout = 0)