色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口接收不定長數據的實現方式

CHANBAEK ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-07-04 15:23 ? 次閱讀

使用串口進行數據的收發在嵌入式產品中是很常用的一種通信方式,因為串口的簡單使用,很容易就被選為產品中數據交互的通信手段。

基于串口進行開發的功能有很多,比如同類/不同類產品之間的通信,RS485通信,RS232通信方式,實現串口命令行終端用于調試等等的。雖然應用的場景有所不同,但是都會涉及到一個共同的問題:怎么確保收到一幀完整的數據?

使用過串口的朋友都會知道,串口收發數據都是按照串行的方式進行的,數據是按照bit的方式一位一位進行發送的。而且發送數據方想要發送的數據長度不一定是固定的,有可能長有可能短,這就會涉及到怎么識別一幀數據已經被接收完了的問題。

1. 串口數據的發送和接收方式

串口的接收和發送在兩個設備之間是按照bit的方式進行通信的,參見下面的示意圖:

圖片

數據從一方按照bit的方式1bit進行傳輸,另外一方也是按照1bit的方式進行接收,直到接收完1Byte數據為止,然后再接收下一個1Byte的數據。

這里還需要考慮另外一個問題,就是一個字節數據之間的時間間隔。簡單而言就是接收第一個字節和第二個字節之間的時間間隔,這個時間間隔在大數據量的情況下是要考慮的,數據量少的情況下可以忽略不計。參見下面的示意圖:

圖片

2. 串口接收不定長數據的實現方式

對于串口接收數據,最需要考慮的是怎么確保收到一幀完整的數據。因為在很多場景下都會遇到的一個問題,就是串口發送的數據是長度不固定的,有時候長有時候短,這就給接收數據和識別數據是有效的帶來了一些難度。

下面根據我個人在項目中使用串口進行數據接收的時候,針對不定長數據的處理方式進行簡單的分享。

2.1、固定格式幀的不定長數據接收

這種數據一般都是應用在某些產品之間的通信協議,有固定的數據幀格式,比如有固定的幀頭和幀尾用于確定數據幀,如下的固定幀頭尾的各式:

#define CMD_HEAD 0XAA5A //幀頭
#define CMD_TAIL 0XFDFCFF //幀尾

這種方式接收數據的時候就比較簡單,可以在接收數據的時候進行判斷,遇到幀頭的時候就開始保存數據,在識別到幀尾之后完成一幀數據的接收,再用其他的手段將這幀數據進行解析。

或者也可以先將所有的數據先接收起來,比如用一個數據緩沖區先保存所有的數據,然后再由應用程序去解析。因為這種數據是有固定格式的,所以解析的時候也很方便,只要按照數據幀的格式進行判別,如果符合格式的定義,就可以認為是一幀完整的數據,否者就丟棄。

2.2、格式不固定長度也不固定的數據的接收

這種數據的接收就相對比較麻煩一點,因為格式不是固定的,沒有明確的標識數據幀開頭和結尾的特征數據,所以這種方式的數據接收往往考慮的是數據幀之間的間隔,根據兩幀數據之間的間隔進行判斷,設置一個時間間隔,如果符合這個時間間隔就認為數據的接收是有效的,否者認為無效。

這種方式需要用到一個計時,并設定一個幀之間的時間間隔,從接收到數據就開始計時,然后每收一個數據就重置這個計時,直到計時到達設置的幀間隔時間沒有再接收到數據則認為數據已經接收完成。

這個幀的時間間隔可以任意設置,一般我們考慮是3.5個字符的時間。如果3.5個字符的時間沒有再收到數據,就認為數據的傳輸已經完成,接收端已經完成了數據的接收。

操作的步驟大致如下:

1)使用一個計時功能

2)接收到數據時啟動計時,然后之后每收到一個數據重置一次這個計時

3)在沒有收到數據之后,計時達到了設定的值,接收就算結束了,處理接收到數據,并關閉計時功能。

4)下一幀的數據接收,重復上面的步驟。

2.3、串口的空閑中斷

這種方式是使用的串口的空閑中斷功能,大概原理是在串口配置開啟了空閑中斷時,如果接收到數據之后就會啟動這個串口的空閑狀態檢測,在一段時間串口不在收到數據就會觸發串口的空閑中斷,告知完成一次數據的接收。

這種方式顯然更好,不用額外再實現空閑檢測功能,只要在串口觸發中斷并是空閑中斷的時候,就知道數據完成了接收。

但是,這個功能不是所有的MCU都具備,一般都是在一些高端一點的MCU中才有,低端一些的MCU估計都是沒有空閑中斷的。

當然,方式還有很多中,這里只是簡單的列舉了本人使用過的幾種方式,具體使用什么樣的方式還要根據實際的項目情況需要而定吧!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5085

    文章

    19138

    瀏覽量

    305710
  • 數據
    +關注

    關注

    8

    文章

    7067

    瀏覽量

    89112
  • 中斷
    +關注

    關注

    5

    文章

    898

    瀏覽量

    41527
  • 串口
    +關注

    關注

    14

    文章

    1555

    瀏覽量

    76584
收藏 人收藏

    評論

    相關推薦

    FreeRTOS串口中斷接收不定長數據與二值信號量的使用

    FreeRTOS例程,使用串口中斷接收不定長數據,以及二值信號量的使用
    的頭像 發表于 09-26 09:02 ?4282次閱讀
    FreeRTOS<b class='flag-5'>串口</b>中斷<b class='flag-5'>接收</b><b class='flag-5'>不定長</b>的<b class='flag-5'>數據</b>與二值信號量的使用

    CW32L083串口中斷+定時器實現不定長數據接收

    CW32L083 用串口中斷加定時器中斷實現串口不定長數據接收,特別適用于AT指令的
    的頭像 發表于 07-12 09:00 ?2037次閱讀
    CW32L083<b class='flag-5'>串口</b>中斷+定時器<b class='flag-5'>實現</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收</b>

    stm32串口怎么用DMA接收不定長數據?

    實現不定長接收。我想要不管傳輸多長字節都可以讓緩存區從頭開始緩存,這樣并不知道怎么實現期待大神3. 或者說我的思路是錯的,DMA接收
    發表于 08-21 09:21

    stm32串口是如何實現接收不定長度數據的呢

    stm32串口是如何實現接收不定長度數據的呢?串口接收數據
    發表于 08-11 08:18

    不定長數據接收的原理是什么?怎么實現串口數據不定長接收?

    不定長數據接收的原理是什么?怎么實現串口數據不定長
    發表于 11-16 08:11

    STM32串口接收不定長數據實現方法

    STM32串口接收不定長數據實現方法
    發表于 12-09 06:17

    如何利用串口空閑中斷接收不定長數據

    在上一篇文章STM32單片機串口空閑中斷接收不定長數據中介紹了利用串口空閑中斷接收
    發表于 02-22 07:34

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    ,那么stm32串口是如何實現接收不定長度數據的呢? 串口接收
    發表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長度數據</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定長數據

    STM32 DMA串口接收不定長數據
    發表于 12-24 18:50 ?40次下載
    STM32  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32之串口DMA接收不定長數據

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

    STM32CUBEMX(8)--USART通過定時器中斷方式接收不定長數據

    本文利用中斷實現串口不定長接收(非DMA),使用HAL庫,將接收數據打印出去。
    的頭像 發表于 11-14 16:31 ?1437次閱讀
    STM32CUBEMX(8)--USART通過定時器中斷<b class='flag-5'>方式</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32CubeMX之串口接收不定長數據

    基本串口通信通常只能接收定長數據,無法穩定接收不定長數據
    的頭像 發表于 05-11 09:59 ?3419次閱讀
    STM32CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

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

    不定長串口數據接收方面,有多種方式可供選擇。以下是幾種常見的方法:1.基于幀頭幀尾:通過在數據幀的開頭和結尾添加特定的幀頭和幀尾標識來確定
    的頭像 發表于 06-07 10:00 ?3194次閱讀
    【筆記】<b class='flag-5'>接收</b><b class='flag-5'>不定長串口</b><b class='flag-5'>數據</b>的<b class='flag-5'>方式</b>(附代碼)

    使用UART IDLE中斷接收不定長數據

    使用UART IDLE中斷接收不定長數據
    的頭像 發表于 09-18 15:41 ?1143次閱讀
    使用UART IDLE中斷<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法
    的頭像 發表于 11-15 01:02 ?555次閱讀
    【代碼分享】基于樂鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收</b>方法
    主站蜘蛛池模板: 久久99精品久久久久久园产越南| 欧美日韩亚洲第一区在线| 日本男女动态图| 成年色黄APP下载| 日本内射精品一区二区视频| babesvideos欧美最新| 视频一区二区中文字幕| 狠狠狠狠狠狠干| 总裁呻吟双腿大开男男H| 欧美黑白配性xxxxx| 国产精品无码视频一区二区| 亚洲无AV在线中文字幕| 老外的好大c的我好爽| 成年人视频在线免费| 美国色吧影院| 国产不卡无码高清视频| 亚洲免费国产| 青青视频国产色偷偷| 果冻传媒在线观看视频| 99精品福利视频| 小伙无套内射老女人| 男人叼女人| 国产色婷亚洲99精品AV在线| 3a丝袜论坛| 丝袜美腿美女被狂躁在线观看| 极品少妇小泬50PTHEPON| 51精品少妇人妻AV一区二区 | 国产色播视频在线观看| 一级大乳奶| 日本黄色www| 久久精品无码人妻无码AV蜜臀 | 99久久精品互换人妻AV| 天天爽夜夜爽| 美女大BXXXXN内射| 国产乱对白精彩在线播放| s8sp视频高清在线播放| 亚洲人成色777777老人头| 前后灌满白浆护士| 老板揉搓秘书丰满大乳| 国精一区二区AV在线观看网站| xxxjapanese丰满奶水|