pySerial read_until() 仅读取第一个字节

问题描述 投票:0回答:2

所以我正在使用 pySerial 从串行端口接收数据。我有一个非常简单的代码,读取第一个字节,检查它是否是起始字节(在我的例子中为

0x02
),然后读取直到找到结束字节(在我的例子中为
0x03
)。

配置串口通讯

port = 'COM3'
baud = 38400

ser = serial.Serial(port, baud, timeout=0)
if ser.isOpen():
    ser.close()
    ser.open()

ser.reset_input_buffer()
ser.reset_output_buffer()

主循环位于

while True
语句内,如下所示。

while True:
    data = ""
    data_raw = ser.read(1)
    if data_raw == b'\x02':
        data_raw = ser.read_until(b'\x03')
        print(str(data_raw))
        ser.reset_input_buffer()
        ser.reset_output_buffer()
        time.sleep(.5)

问题是,由于某种原因,

read_until()
实际上只读取第一个再见,而我从串行端口接收的数据实际上是
b'\x02\xff\x9c\x81E1\x03\'

正确阅读了

\x02
read_until()
语句后,只读取了下一个
\xff
,我不明白为什么

python serial-port pyserial
2个回答
2
投票

这似乎是

pySerial
模块本身从未修复的错误 https://github.com/pyserial/pyserial/issues/181

timeout=None
中使用
serial.Serial()
解决了问题


0
投票

根据this comment,如果参数被编码为字节数组,即使

timeout
serial.Serial()
中设置,它也会工作。

这对我有用(使用你的变量名称):

data_raw = ser.read_until(expected='\x03'.encode('UTF-8'))
© www.soinside.com 2019 - 2024. All rights reserved.