我有一个控制盒和一个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\0x12\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)
答案 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个字节(但您可能希望调用另一个函数来处理整个数据包),然后该数据包被丢弃,准备开始下一个到达的内容