Skip to main content
 首页 » 编程设计

python之如何使用 python 查找串行流的第一个字节

2025年05月04日7lovecherry

我正在尝试使用 python 3.3.2 和 pyserial 从 RS232 读取数据流。我开始直播:

ser = serial.Serial('/dev/ttyUSB0', baudrate=19200, timeout=3, stopbits=serial.STOPBITS_TWO) 
ser.write(bytes([0x05, 0x69, 0x02, 0x0A, 0x86])) 

在此之后我每秒得到一个 107 字节长的数据集。第一个字节应为 107(字节数),第二个字节应为 105(代码)。

分隔一个以 107 和 105 开头的 107 字节长数据集的最佳方法是什么?如果我使用 print(ser.read(107)) 几次,我会得到:

b'\x00\x00\x00\x00\x00P\xbf\x99\x10\xe0}\x86\xaaV\xd4\xeeg\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87}i\xdf\n\x00\x00\r\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xc3k\x00\x00\x00\xc0t\xb4\xbd\xf0\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Y\x00\x00\x00\x00\x00\x00\x80\x01\x00\x80\xc7\x10\xc0\xcd\xe6G\x0b\x99\xd4\xcb.' 
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc5\xeck\x00\x00\x00\xc0\xf4\xb3\xbd\xf0\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0V\x00\x00\x00\x00\x00\x00\x80\x01\x00\x00\xc8\x10@\xcd\xe67\x8b\x99\xd4\x0b/\x00\x00@\x00\xf6\xb7\xbf\xfd\xed\xaf:\x00\x00\x00\xe8\xf3J\xaf\x04\x00\x00\x00\x00\x00p\xbf\x99\x18\xe0}\x86\xaaV\xd4\xeeg\x12\x00\x00\x00\x00\x00\x00\x00' 

k(107 的 ascii)在中间某处。

请您参考如下方法:

在您发出请求之前刷新您的输入可能会有所帮助。即,

ser.read(ser.inWaiting()) 

读出所有等待的字节。然后,希望不再发送更多字节,您可以发送命令:

ser.write(bytes([0x05, 0x69, 0x02, 0x0A, 0x86])) 

这应该确保接下来的所有字节都是对该命令的答复。

然后读取数据,直到得到你的 107:

found = False 
buffer = '' # what is left from the previous run... 
while not found: 
    rd = ser.read(50) 
    buffer += rd 
    sp = buffer.split(chr(107), 1) 
    if len(sp) == 2: 
        pkt = chr(107) + sp[1] # candidate for a valid packet 
        if pkt[1] == chr(105): #  
            while len(pkt) < 107: # TODO add a timeout condition here... 
                rd = ser.read(107 - len(pkt)) 
                pkt += rd 
            found = True 
        else: 
            buffer = pkt[1:] # process this further... 
    else: # no 107 found; empty the buffer. 
        buffer = '' 
# Now we have a pkt of 107 bytes and can do whatever we want with it.