解决串口数据乱序问题
环境:jetson nano ubuntu 20.04
python 3.12
终于是找到解决串口乱序的最佳解决办法了,先来看看什么是串口乱序:
这就是一个典型的串口乱序,我的发送端发送 的协议为
0x55 0x51 ...
0x55 0x52 ...
0x55 0x53 ...
0x55 0x54 ...
在这四条协议中循环发送,每条均为11个hex,图中可以看到明显的乱序了,该如何解决乱序呢
我的办法就是放弃当前一条的消息,让串口数据回归正常顺序,因为发送段发送的数据是不可能乱的,发送端是一个一个hex进行发送,只是接收端因为不正常的read方法,导致数据格式混乱了,这时候只要读取帧头,然后放弃当前帧的数据,将帧头后续的数据和校验全部读出来放弃,然后下一帧就能够正常使用read读取
例如加上这段代码,我的数据就不会乱序了
if pos == 0:data = ser.read(2)if data[0] == 0x55 and (data[1] >= 0x51 and data[1] <= 0x58):ser.read(9) pos = 1
优化一下代码,写成类,即可即插即用
class SerialOverLoad:def __init__(self,uart,buffer_size:int,frame_headers):"""uart: 串口buffer_size:每一帧长度(包括校验和帧尾)frame_headers: 帧头 格式如:[[0xcc, ...], ...]"""self._over = 1self._uart = uartself._buffer_size = buffer_sizeself._frame_headers = frame_headersdef start(self):if self._over:check_data = self._uart.read(len(self._frame_headers[0]))check_data = [x for x in check_data]if check_data in self._frame_headers:self._uart.read(self._buffer_size-len(check_data))self._over = 0seroverload = SerialOverLoad(ser,11,[[0x55,0x51],[0x55,0x52],[0x55,0x53],[0x55,0x54]])
运行结果:
可以看到结果十分不错