Python - 读取经常发送用于解析的串行数据

时间:2018-01-23 15:52:57

标签: python parsing serial-port byte pyserial

我有一个控制盒和一个Raspberry Pi,通过串口(串口到RJ45)进行通信,我需要从控制盒发送的命令,每50ms发送一次。我能够阅读代码,但问题就在这里。当我开始阅读时,起始字节不正确,所以我无法解析它。

例如(我目前得到的输出):

b'\0x21\0x21\0x98\0x98\0x21\0x21\0x18\0x12\0x21\0x12\0x02\0x32\0x11

我需要的起始字节必须是0x98,所以我需要它像这样

b'\0x98\0x98\0x21\0x21\0x18\0x12\0x21\0x12\0x02\0x32\0x11\0x‌​12\0x11

我需要这种方式,所以我可以解析该行,并说抓住字节[4] - (0x21)或类似的东西。

在研究方面,我遇到了Struct。我不知道如何使用它,我不知道我是否需要使用它。

我目前还没有完整版本的代码,但这里有一个我目前所拥有的快速示例:

import serial
import time

port = serial.Serial("/dev/ttyS0", baudrate=9600)

while True:
   output = port.read(13) # --- In Total there are 13 Bytes
   print(output)

1 个答案:

答案 0 :(得分:0)

由于您每50毫秒收到大量数据,因此您需要能够与数据的开头同步:

buffer = b''
header = b'\0x98'
while True:
    if port.in_waiting:
        buffer += port.read(port.in_waiting)
    while len(buffer) >= 2:
        if buffer[0] == header and buffer[1] == header:
            break
        buffer=buffer[1:]
    if len(buffer) >= 13:
        print(buffer[:13]) # or otherwise process latest buffer
        buffer = buffer[13:]

此代码以空缓冲区开头,然后读取到达串行端口的任何数据。虽然缓冲区不以两个头字节开头,但前面的任何多余都将被丢弃。一旦缓冲区以正确的标头开始并且足够长,这里将打印13个字节(但您可能希望调用另一个函数来处理整个数据包),然后该数据包被丢弃,准备开始下一个到达的内容