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

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

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

3天內不再提示

串口的循環隊列是什么?

Q4MP_gh_c472c21 ? 來源:單片機愛好者 ? 作者:單片機愛好者 ? 2022-05-12 14:57 ? 次閱讀

先說串口,這個應該都知道吧(不知道的童鞋,先把基本功學好),大部分單片機或者處理器都會帶一個或者多個串口,方便進行數據的通信

那么,串口的循環隊列是什么?這里以STM32的串口為例,進行解釋說明。

假設串口一次只發一個數據,這倒是簡單了,每次只對這一個數據進行判斷,然后處理相關指令。但現實不會一直都這么美好,很多時候你收到的可能是一大串數據,你要先小心翼翼的把它們存好,然后再依次判斷這里面有哪些指令要處理。

假設你定義了一個30個元素的數組a[30],每次串口收到數據都往里面存,存的時候地址加一。這個操作很簡單吧,應該是都會的。

但是取的時候怎么取?你收到的指令可能是2個數據,也可能是3個數據,幾種長度不一樣的指令混在一起。

一次從數組里讀出幾個數據?怎么快速騰出已讀數據的位置?還是一次都讀完,然后整個數組清零?

先說一次讀完,然后清零的這個方法為什么不行。

1、讀的時候,里面的數據不一定是完整的。有可能某組數據剛接收到一半兒。

2、讀完以后,清零之前,如果進來新的數據怎么辦?

所以,比較穩妥的方法是,一次只讀一個數據,讀一次,清除該數據所占的位置。所以這需要一個變量,來記錄數據頭在這個數組中的位置。

第二,當有新數據來的時候,要知道它能放在哪,所以要有一個變量,來記錄數據尾在哪。

第三,如果有必要,你可以定義一個變量來記錄數據長度,存入的時候加一,取出的時候減一。

第四,也是比較重要的,如果數據尾已經是a[29]了,下一個數據放哪?整個數組都清掉?NO,假設此時a[0]~a[10]已經被取出了,數據頭變成了a[11]。那么新的數據尾變成a[0],即當數據尾大于等于30的時候,變成0.

如此一來,相當于把這個數組的頭和尾連了起來,成了一個封閉的環,這種處理方式,就叫做串口的循環隊列。只要確保數組夠大,處理速度夠快,那么頭和尾就不會撞上。當然,程序上也要對這種意外情況做一個處理。以下圖片來自網絡

2f4b19b4-d1b6-11ec-bce3-dac502259ad0.png

下面是代碼,核心的部分都在這,復制粘貼一下,基本就可以了。

首先是定義一個結構體,關于數據頭、數據尾、數組的:

typedef struct

{

u16 Head;

u16 Tail;

u16 Length;

u8 Rsv_DAT[50];

}ringbuff_t;

ringbuff_t Ringbuff;

然后是結構體初始化:

void ringbuff_init(void)

{

Ringbuff.Head = 0;

Ringbuff.Tail = 0;

Ringbuff.Length = 0;

}

然后是存入數據的操作,把這個函數放進串口接收中斷就行:

u8 write_ringbuff(u8 data)

{

if(Ringbuff.Length >= 50)

{

return FALSE;

}

else

{

Ringbuff.Rsv_DAT[Ringbuff.Tail] = data;

Ringbuff.Tail = (Ringbuff.Tail + 1)% 50;//防止越界

Ringbuff.Length++;

return TRUE;

}

}

然后是取出數據的操作:

u8 read_ringbuff(u8 *rdata)

{

if(Ringbuff.Length == 0)

{

return FALSE;

}

else

{

*rdata = Ringbuff.Rsv_DAT[Ringbuff.Head];

Ringbuff.Rsv_DAT[Ringbuff.Head] = 0;

Ringbuff.Head = (Ringbuff.Head + 1)%50;

Ringbuff.Length--;

return TRUE;

}

}

然后就能用了,這是寫操作:

write_ringbuff(USART_ReceiveData(USART1));

這是讀操作:

read_ringbuff(&uart_buf[0]);

讀操作的函數里,還可以增加一個操作,就是讀出以后,把該位置數據清零,這個看個人需要。

以上,就是串口循環隊列的一個簡介,如果有寫的不好的,歡迎留言指正。當然,方法千千萬,不一定只能用這種。最后,借用流浪地球的一句經典臺詞作為結尾:

方法千萬條,穩定第一條。

代碼不規范,碼農兩行淚。

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

    關注

    2270

    文章

    10906

    瀏覽量

    356530
  • 串口
    +關注

    關注

    14

    文章

    1555

    瀏覽量

    76647
  • 代碼
    +關注

    關注

    30

    文章

    4799

    瀏覽量

    68728

原文標題:基于STM32的串口循環隊列

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    JavaWeb消息隊列使用指南

    在現代的JavaWeb應用中,消息隊列(Message Queue)是一種常見的技術,用于異步處理任務、解耦系統組件、提高系統性能和可靠性。 1. 消息隊列的基本概念 消息隊列是一種應用程序對應
    的頭像 發表于 11-25 09:27 ?157次閱讀

    為什么通信要使用虛擬串口串口助手?

    串口助手和虛擬串口是什么?串口助手和虛擬串口串口通信中很常見。串口助手是用于
    的頭像 發表于 11-15 01:04 ?1252次閱讀
    為什么通信要使用虛擬<b class='flag-5'>串口</b>和<b class='flag-5'>串口</b>助手?

    為什么同一個隊列引用的全局變量,運行在兩個子vi中發現隊列數據丟失了

    我創建了一個隊列,然后將隊列引用做了個全局變量,運行在兩個子vi中,一個是只入隊列,另一個是只出隊列。但我發現,一個字vi數據入隊列成功,檢
    發表于 11-14 11:47

    嵌入式環形隊列與消息隊列的實現原理

    嵌入式環形隊列,也稱為環形緩沖區或循環隊列,是一種先進先出(FIFO)的數據結構,用于在固定大小的存儲區域中高效地存儲和訪問數據。其主要特點包括固定大小的數組和兩個指針(頭指針和尾指針),分別指向
    的頭像 發表于 09-02 15:29 ?569次閱讀

    玩轉RT-Thread之消息隊列的應用

    在嵌入式系統開發中,實時處理串口和ADC數據是一項重要的任務。本文將介紹如何在RT-Thread實時操作系統中,利用消息隊列來同時處理來自串口和ADC的數據。通過這種方法,我們能夠高效地管理和處理
    的頭像 發表于 07-23 08:11 ?627次閱讀
    玩轉RT-Thread之消息<b class='flag-5'>隊列</b>的應用

    在arduino平臺上開發esp32c3,twai隊列異常的原因?

    twai_get_status_info。發現在TX隊列里有一個數據。但是當任務到主循環的開頭再次讀取狀態時則發現數據跑到了RX隊列,而實際上CAN總線上并沒有發送任何數據給ESP32C3。
    發表于 06-11 06:16

    Freertos隊列項里的字節長度是否可以獲取?

    最近剛學Freertos, 看到可以獲取Freertos隊列長度,但是隊列項里的字節長度是否可以獲取? 因為項目中隊列中會存放不定長字節,需要對隊列中的數據分揀,每次分揀的時候遍歷所
    發表于 04-29 07:17

    進程間通信的消息隊列介紹

    消息隊列是一種非常常見的進程間通信方式。
    的頭像 發表于 04-08 17:27 ?314次閱讀

    MCU專屬隊列功能模塊之QueueForMcu應用

    當需要從隊列頭部獲取多個數據,但又不希望數據從隊列中刪除時,可以使用 Queue_Peek_Array 函數來實現,該函數的參數與返回值與 Queue_Pop_Array 完全相同。
    發表于 03-20 11:44 ?521次閱讀
    MCU專屬<b class='flag-5'>隊列</b>功能模塊之QueueForMcu應用

    什么是PLC循環移位指令 PLC循環移位的特點

    PLC循環移位指令包括循環左移指令和循環右移指令。在循環移位過程中,移出的位并不會丟失,而是會放回空出的位上,形成一個環形移位。
    的頭像 發表于 03-07 16:57 ?2215次閱讀
    什么是PLC<b class='flag-5'>循環</b>移位指令 PLC<b class='flag-5'>循環</b>移位的特點

    arduino如何停止loop循環

    Arduino的loop循環是其主要的程序執行部分,該循環將在Arduino開發板上持續運行,并且只有在程序被重新上傳或開發板斷電重啟時才會停止。然而,在某些情況下,你可能需要在程序執行過程中停止或
    的頭像 發表于 02-14 16:24 ?4586次閱讀

    arduino中while循環怎么跳出

    Arduino 是一款開源的硬件平臺,廣泛應用于各種物聯網和嵌入式系統項目。在 Arduino 上編寫代碼時,循環結構起到了至關重要的作用。而其中的 while 循環更是常用于需要根據特定條件重復
    的頭像 發表于 02-14 16:22 ?2635次閱讀

    循環指令loop規定循環次數

    循環指令是計算機編程中非常重要的概念,它允許程序重復執行一段代碼塊,使得程序可以更有效地處理大量數據和重復性任務。在本文中,我們將詳盡、詳實、細致地介紹循環指令的相關概念、語法和應用場
    的頭像 發表于 02-14 16:10 ?1737次閱讀

    裸機中環形隊列與RTOS中消息隊列有何區別呢?

    “環形隊列”和“消息隊列”在嵌入式領域有應用非常廣泛,相信有經驗的嵌入式軟件工程師對它們都不陌生。
    的頭像 發表于 01-26 09:38 ?727次閱讀
    裸機中環形<b class='flag-5'>隊列</b>與RTOS中消息<b class='flag-5'>隊列</b>有何區別呢?

    嵌入式開發C語言工具代碼示例講解

    循環隊列是一種高效的數據結構,適用于緩沖區和數據流應用,例如串口通信接收緩沖。
    發表于 01-21 10:05 ?588次閱讀
    主站蜘蛛池模板: 网红刘婷hd国产高清| 擼擼擼麻豆密臀AV| 清晨紧湿爱运动h高h| 第一福利视频网站在线| 特级做A爰片毛片免费看108| 国产一区二区三区内射高清 | 久久内在线视频精品mp4| 91看片淫黄大片.在线天堂 | 亚洲AV无码国产精品午夜久久| 精品国产乱码久久久久久人妻| 早乙女由依在线观看| 欧美一级做a爰片免费| 国产情侣真实露脸在线| 中文字幕在线观看亚洲视频| 热久久2018亚洲欧美| 红豆视频免费资源观看| AV亚洲精品少妇毛片无码| 亚洲国产精品第一影院在线观看| 东北嫖妓对白粗口| 亚洲日韩一区精品射精| 欧美精品XXXXBBBB| 国产亚洲制服免视频| A国产一区二区免费入口| 亚洲国产精品自在自线观看| 国产人在线成免费视频| 91九色视频在线观看| 亚洲AV国产精品无码精| 女性性纵欲派对| 九九精品在线播放| 国产成人精品区在线观看| 中文字幕乱偷无码AV蜜桃| 色色男_免费| 美女脱得只剩皮肤| 国语对白刺激真实精品| 大香伊人中文字幕精品| 最新黄色在线| 亚洲精品资源网在线观看| 色人格影院第四色| 欧美xxbb| 毛片内射久久久一区| 精品免费久久久久久成人影院|