2

我正在尝试使用 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'

kascii for 107)在中间的某个地方。

4

1 回答 1

2

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

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.
于 2013-10-13T18:11:40.920 回答