串口不定長數據包
1、背景
為什么要實現串口不定長數據包的接收?
在使用串口進行數據接時,有時候我們并不知道對方的串口數據協(xié)議格式,于是沒辦法按照協(xié)議進行解析,也就無法提取完整的數據包出來,而應用層則需要完整的數據包進行處理,就迫使我們需要實現一種不定長數據包提取的實現方式;
舉個例子,如果我們串口對接的是設備的串口的日志,由于日志并不是固定長度的,那么我們如何來提取一行日志呢(通過判斷換行符是一種方法)?如果對方的日志是不可見字符呢?
通過實現串口不定長數據包的接收,可以提高系統(tǒng)的靈活性和適應性,使其能夠更好地應對不同的數據傳輸需求。
一句話: 本文實現了esp32串口不定長數據接收方法,當接收數據超過512個字節(jié)自動按512個字節(jié)自動打包,如果不足512個字節(jié),則通過兩個數據的時間間隔差自動拆分包;
不想聽我啰嗦,公眾號后臺私信: 代碼分享 即可獲取完整工程;
2、實現
在STM32平臺有一個串口空閑的標志位,我們通過判斷串口的空閑標志位來實現,但是如果使用ESP32,則很遺憾,我并沒有見到有此標志位可以使用,那么本文將通過軟件方式來實現串口不定長數據的接收實現;
2.1、實現平臺
idf版本: esp-idf-v5.2.0
硬件: esp32-c3
2.2、實現的邏輯
在串口接收到數據時,啟動串口數據監(jiān)聽和串口數據包處理兩個線程;
監(jiān)聽線程監(jiān)聽到數據:判斷接收到的數據長度是否大于512個字節(jié),如果是則把512個字節(jié)打包為一個數據包,如果數據不足512個字節(jié),則先緩存起來,然后記錄此時的時間為T1;
如果打包之后還有數據,則繼續(xù)運行第1步,如果剩余的數據不足512個字節(jié),則先緩存起來,然后記錄此時的時間T1;
定時器周期檢測T1與當前時間的差值,如果差值大于100ms,則把剩余的數據打包為一個數據包;
如果還有新的數據監(jiān)測到,則重新開始第1步;
串口數據包處理現場監(jiān)聽到有數據包處理則進行處理;
2.3、邏輯流程圖
串口不定長流程圖
3實現效果測試數據
3.1、 數據小于512個字節(jié)
串口輸入(20個字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"
代碼識別:達到預期效果
uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
串口輸入(20個字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"(150ms周期發(fā)送)
代碼識別(自動拆分為多次多個數據包,每個數據包還是21個字節(jié)):達到預期效果
uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
串口輸入(20個字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"(15ms周期發(fā)送)
uart_rx_ap|229|[uart]***********************0512**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]303030303030303030303030
uart_rx_ap|229|[uart]***********************0176**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]30303030303030303030303030303030
- 代碼識別:達到預期效果(按512個字節(jié)打包,不足的按間隔打包)
3.2、數據等于于512個字節(jié)
- 串口輸入(512個字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 ... ... 30"
- 代碼識別:達到預期效果
uart_rx_ap|229|[uart]***********************0512**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]303030303030303030303030
3.3、數據大于512個字節(jié)
串口輸入(565個字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 ... ... 30"
代碼識別:達到預期效果
uart_rx_ap|229|[uart]***********************0512**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]303030303030303030303030
uart_rx_ap|229|[uart]***********************0053**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030
uart_rx_ap|229|[uart]30303030303030303030303030
溫馨提示: 公眾號后臺私信發(fā)送: 代碼分享 即可獲取完整工程;
-
串口
+關注
關注
15文章
1598瀏覽量
81488 -
數據包
+關注
關注
0文章
269瀏覽量
25321 -
數據接收
+關注
關注
0文章
12瀏覽量
7971 -
ESP32
+關注
關注
21文章
1047瀏覽量
20459
發(fā)布評論請先 登錄
stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

評論