所以我正在使用 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
,我不明白为什么
这似乎是
pySerial
模块本身从未修复的错误 https://github.com/pyserial/pyserial/issues/181
在
timeout=None
中使用 serial.Serial()
解决了问题
根据this comment,如果参数被编码为字节数组,即使
timeout
在serial.Serial()
中设置,它也会工作。
这对我有用(使用你的变量名称):
data_raw = ser.read_until(expected='\x03'.encode('UTF-8'))