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