无法从串行端口接收完整的数据

时间:2019-07-08 07:12:54

标签: python python-3.x

这是我的github代码的link。我想从COM端口接收串行数据,其大小为8196个字符。 但是每次我获得不同的数据和不同的数据大小,而又不完全是8196个字符。

我尝试调整时间延迟,并且还包含了flushinput(),但没有正确获取完整的数据

import serial
import time
ser=serial.Serial(port="COM5",baudrate=57600)
ser.write(serial.to_bytes(cmd))                 
time.sleep(0.5)
data=ser.read()
time.sleep(1) 
data_left=ser.inWaiting()
data+=ser.read(data_left)
ser.flushInput()
print("Data: ",hex(int.from_bytes(data,byteorder="big")))

我希望在控制台窗口上收到完整的数据...

1 个答案:

答案 0 :(得分:2)

您需要继续读取RX缓冲区,直到其为空。为此,您可以使用循环:

import serial
import time
ser=serial.Serial(port="COM5",baudrate=57600, timeout=1.0)
ser.write(serial.to_bytes(cmd))                 
time.sleep(1)
data=b""
timeout = time.time() + 3.0
while ser.inWaiting() or time.time()-timeout < 0.0:   #keep reading until the RX buffer is empty and wait for 3 seconds to make sure no more data is coming
    if ser.inWaiting() > 0:
        data+=ser.read(ser.inWaiting())
        timeout = time.time() + 3.0
    else:
        print("waiting...")

ser.flushInput()
print("Data: ",hex(int.from_bytes(data,byteorder="big")))

循环中的计时器旨在避免当接收器尝试读取的速度快于数据到达的速度时循环结束。

编辑:深入研究之后,我意识到了为什么上面的代码仍然无法正常工作。

我(错误的)理解是ser.read()会读取ser.inWaiting()所指示的字节数,但事实证明(您只需要看一下code!){{ 1}}与ser.read()完全相同。

如前所述,一次读取1个字节会导致大量开销,以致RX缓冲区溢出。要解决此问题,您只需将可用的字节数添加为读取函数的参数即可:

ser.read(1)

对此感到困惑的歉意。