環境: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]])
運行結果:
可以看到結果十分不錯