0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【代碼分享】基于樂(lè)鑫ESP32的串口不定長(zhǎng)數(shù)據(jù)接收方法

機(jī)智云 ? 2024-11-15 01:02 ? 次閱讀

4744694a-a2aa-11ef-8084-92fbcf53809c.png串口不定長(zhǎng)數(shù)據(jù)包

1、背景

為什么要實(shí)現(xiàn)串口不定長(zhǎng)數(shù)據(jù)包的接收?

在使用串口進(jìn)行數(shù)據(jù)接時(shí),有時(shí)候我們并不知道對(duì)方的串口數(shù)據(jù)協(xié)議格式,于是沒(méi)辦法按照協(xié)議進(jìn)行解析,也就無(wú)法提取完整的數(shù)據(jù)包出來(lái),而應(yīng)用層則需要完整的數(shù)據(jù)包進(jìn)行處理,就迫使我們需要實(shí)現(xiàn)一種不定長(zhǎng)數(shù)據(jù)包提取的實(shí)現(xiàn)方式;

舉個(gè)例子,如果我們串口對(duì)接的是設(shè)備的串口的日志,由于日志并不是固定長(zhǎng)度的,那么我們?nèi)绾蝸?lái)提取一行日志呢(通過(guò)判斷換行符是一種方法)?如果對(duì)方的日志是不可見(jiàn)字符呢?

通過(guò)實(shí)現(xiàn)串口不定長(zhǎng)數(shù)據(jù)包的接收,可以提高系統(tǒng)的靈活性和適應(yīng)性,使其能夠更好地應(yīng)對(duì)不同的數(shù)據(jù)傳輸需求。

一句話(huà): 本文實(shí)現(xiàn)了esp32串口不定長(zhǎng)數(shù)據(jù)接收方法,當(dāng)接收數(shù)據(jù)超過(guò)512個(gè)字節(jié)自動(dòng)按512個(gè)字節(jié)自動(dòng)打包,如果不足512個(gè)字節(jié),則通過(guò)兩個(gè)數(shù)據(jù)的時(shí)間間隔差自動(dòng)拆分包;

不想聽(tīng)我啰嗦,公眾號(hào)后臺(tái)私信: 代碼分享 即可獲取完整工程;

2、實(shí)現(xiàn)

STM32平臺(tái)有一個(gè)串口空閑的標(biāo)志位,我們通過(guò)判斷串口的空閑標(biāo)志位來(lái)實(shí)現(xiàn),但是如果使用ESP32,則很遺憾,我并沒(méi)有見(jiàn)到有此標(biāo)志位可以使用,那么本文將通過(guò)軟件方式來(lái)實(shí)現(xiàn)串口不定長(zhǎng)數(shù)據(jù)的接收實(shí)現(xiàn);

2.1、實(shí)現(xiàn)平臺(tái)

idf版本: esp-idf-v5.2.0

硬件: esp32-c3

2.2、實(shí)現(xiàn)的邏輯

在串口接收到數(shù)據(jù)時(shí),啟動(dòng)串口數(shù)據(jù)監(jiān)聽(tīng)和串口數(shù)據(jù)包處理兩個(gè)線(xiàn)程;

監(jiān)聽(tīng)線(xiàn)程監(jiān)聽(tīng)到數(shù)據(jù):判斷接收到的數(shù)據(jù)長(zhǎng)度是否大于512個(gè)字節(jié),如果是則把512個(gè)字節(jié)打包為一個(gè)數(shù)據(jù)包,如果數(shù)據(jù)不足512個(gè)字節(jié),則先緩存起來(lái),然后記錄此時(shí)的時(shí)間為T(mén)1;

如果打包之后還有數(shù)據(jù),則繼續(xù)運(yùn)行第1步,如果剩余的數(shù)據(jù)不足512個(gè)字節(jié),則先緩存起來(lái),然后記錄此時(shí)的時(shí)間T1;

定時(shí)器周期檢測(cè)T1與當(dāng)前時(shí)間的差值,如果差值大于100ms,則把剩余的數(shù)據(jù)打包為一個(gè)數(shù)據(jù)包;

如果還有新的數(shù)據(jù)監(jiān)測(cè)到,則重新開(kāi)始第1步;

串口數(shù)據(jù)包處理現(xiàn)場(chǎng)監(jiān)聽(tīng)到有數(shù)據(jù)包處理則進(jìn)行處理;

2.3、邏輯流程圖

47712836-a2aa-11ef-8084-92fbcf53809c.png串口不定長(zhǎng)流程圖

3實(shí)現(xiàn)效果測(cè)試數(shù)據(jù)

3.1、 數(shù)據(jù)小于512個(gè)字節(jié)

串口輸入(20個(gè)字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"

代碼識(shí)別:達(dá)到預(yù)期效果

uart_rx_ap|229|[uart]***********************0020**********************
uart_rx_ap|229|[uart]3030303030303030303030303030303030303030

串口輸入(20個(gè)字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30"(150ms周期發(fā)送)

代碼識(shí)別(自動(dòng)拆分為多次多個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包還是21個(gè)字節(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個(gè)字節(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

  • 代碼識(shí)別:達(dá)到預(yù)期效果(按512個(gè)字節(jié)打包,不足的按間隔打包)

3.2、數(shù)據(jù)等于于512個(gè)字節(jié)

  • 串口輸入(512個(gè)字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 ... ... 30"
    • 代碼識(shí)別:達(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個(gè)字節(jié)

串口輸入(565個(gè)字節(jié)):"30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 ... ... 30"

代碼識(shí)別:達(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

溫馨提示: 公眾號(hào)后臺(tái)私信發(fā)送: 代碼分享 即可獲取完整工程;

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1554

    瀏覽量

    76508
  • 數(shù)據(jù)包
    +關(guān)注

    關(guān)注

    0

    文章

    261

    瀏覽量

    24391
  • 數(shù)據(jù)接收
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    7813
  • ESP32
    +關(guān)注

    關(guān)注

    18

    文章

    971

    瀏覽量

    17255
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    不定長(zhǎng)數(shù)據(jù)接收的原理是什么?怎么實(shí)現(xiàn)串口數(shù)據(jù)不定長(zhǎng)接收?

    不定長(zhǎng)數(shù)據(jù)接收的原理是什么?怎么實(shí)現(xiàn)串口數(shù)據(jù)不定長(zhǎng)接收
    發(fā)表于 11-16 08:11

    STM32串口接收不定長(zhǎng)數(shù)據(jù)的實(shí)現(xiàn)方法

    STM32串口接收不定長(zhǎng)數(shù)據(jù)的實(shí)現(xiàn)方法
    發(fā)表于 12-09 06:17

    基于DMA接收利用空閑模式接收不定長(zhǎng)數(shù)據(jù)

    的利用空閑模式接收不定長(zhǎng)數(shù)據(jù)方法,都是基于DMA接收的,個(gè)人項(xiàng)目因?yàn)橛械凸男枰?,平時(shí)是在停機(jī)模式,在喚醒后才能
    發(fā)表于 01-12 07:44

    HAL庫(kù)下串口接收不定長(zhǎng)數(shù)據(jù)方法

    STM32單片機(jī)HAL庫(kù)下串口接收不定長(zhǎng)數(shù)據(jù)HAL庫(kù)下的串口接收
    發(fā)表于 01-19 06:55

    了解在MCU中實(shí)現(xiàn)串口不定長(zhǎng)數(shù)據(jù)接收的過(guò)程

    在MCU的應(yīng)用中,經(jīng)常需要通過(guò)串口進(jìn)行不定長(zhǎng)數(shù)據(jù)包的傳輸。發(fā)送方很簡(jiǎn)單,不需特別的考慮,而接收方則需要能夠偵測(cè)到數(shù)據(jù)包的結(jié)束。
    的頭像 發(fā)表于 08-03 16:37 ?7257次閱讀
    了解在MCU中實(shí)現(xiàn)<b class='flag-5'>串口</b>的<b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>包<b class='flag-5'>接收</b>的過(guò)程

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

    1.不定長(zhǎng)度數(shù)據(jù) 為什么會(huì)存在串口接收不定長(zhǎng)度數(shù)據(jù)呢?首先,在通信雙方進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候,由于不同的設(shè)備在實(shí)現(xiàn)控制,
    發(fā)表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)度數(shù)據(jù)</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

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

    STM32 DMA串口接收不定長(zhǎng)數(shù)據(jù)
    發(fā)表于 12-24 18:50 ?40次下載
    STM32  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

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

    目錄STM32之串口DMA接收不定長(zhǎng)數(shù)據(jù)引言DMA簡(jiǎn)介什么是DMA在STM32的DMA資源DMA接收數(shù)據(jù)
    發(fā)表于 12-24 19:03 ?30次下載
    STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

    樂(lè)esp32-c2開(kāi)發(fā)演示

    樂(lè)esp32-c2開(kāi)發(fā)演示
    的頭像 發(fā)表于 11-17 15:39 ?2269次閱讀
    <b class='flag-5'>樂(lè)</b><b class='flag-5'>鑫</b><b class='flag-5'>esp32</b>-c2開(kāi)發(fā)演示

    STM32CubeMX之串口接收不定長(zhǎng)數(shù)據(jù)

    基本串口通信通常只能接收定長(zhǎng)數(shù)據(jù),無(wú)法穩(wěn)定接收不定長(zhǎng)數(shù)據(jù)
    的頭像 發(fā)表于 05-11 09:59 ?3395次閱讀
    STM32CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

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

    不定長(zhǎng)串口數(shù)據(jù)接收方面,有多種方式可供選擇。以下是幾種常見(jiàn)的方法:1.基于幀頭幀尾:通過(guò)在數(shù)據(jù)幀的開(kāi)頭和結(jié)尾添加特定的幀頭和幀尾標(biāo)識(shí)來(lái)確定
    的頭像 發(fā)表于 06-07 10:00 ?3168次閱讀
    【筆記】<b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)串口</b><b class='flag-5'>數(shù)據(jù)</b>的方式(附<b class='flag-5'>代碼</b>)

    樂(lè)ESP32-DevKitS-V1.1參考設(shè)計(jì)

    樂(lè)ESP32-DevKitS-V1.1參考設(shè)計(jì)樂(lè)多年來(lái)深耕?AIoT?領(lǐng)域軟硬件產(chǎn)品的研發(fā)與設(shè)計(jì),專(zhuān)注于研發(fā)高集成、低功耗、性能卓越、安
    發(fā)表于 10-19 16:13 ?2次下載

    樂(lè)ESP32-WROOM-32UE參考設(shè)計(jì)

    樂(lè)ESP32-WROOM-32UE參考設(shè)計(jì)ESP32將天線(xiàn)開(kāi)關(guān)、RFbalun、功率放大器、接收低噪聲放大器、濾波器、電源管理模塊等功能集
    發(fā)表于 10-19 16:13 ?14次下載

    樂(lè)ESP32-SenseKit參考設(shè)計(jì)

    樂(lè)ESP32-SenseKit參考設(shè)計(jì)ESP32將天線(xiàn)開(kāi)關(guān)、RFbalun、功率放大器、接收低噪聲放大器、濾波器、電源管理模塊等功能集于一
    發(fā)表于 10-19 16:13 ?2次下載

    樂(lè)ESP32-MINI-1參考設(shè)計(jì)

    樂(lè)ESP32-MINI-1參考設(shè)計(jì)樂(lè)多年來(lái)深耕?AIoT?領(lǐng)域軟硬件產(chǎn)品的研發(fā)與設(shè)計(jì),專(zhuān)注于研發(fā)高集成、低功耗、性能卓越、安全穩(wěn)定、高性
    發(fā)表于 10-19 16:13 ?13次下載