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

stm32 串口接收不定長度數(shù)據(jù)及黏包處理 + 串口DMA接收

STM32之串口DMA接收不定長數(shù)據(jù)

【筆記】接收不定長串口數(shù)據(jù)的方式(附代碼)

評論