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

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

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

3天內不再提示

分享關于嵌入式軟件中的串口收發隊列設計方法

FPGA之家 ? 來源:嵌入式案例Show ? 作者:嵌入式案例Show ? 2021-05-08 09:11 ? 次閱讀

01前言

嵌入式軟件的開發中,串口是十分常用且基礎的功能。在需要批量發送數據的場合,可以使用while循環等待發送完成標志位的方式,但是這種方式會占據主循環,影響效率。也可以采用dma的方式,但是dma在發送數據時非常高效,但是批量接收數據時,就很不靈活,特別是一些在串口數據中解析某種協議格式時,很不方便。下面介紹一種利用串口中斷結合FIFO隊列的串口數據收發方法,結合了不阻塞批量發與靈活接收的優點,特別適用于串口協議收發的使用場景。

02FIFO隊列

FIFO是英文First In First Out 的縮寫,是一種先進先出的數據緩存器,順序寫入數據,順序的讀出數據,其數據地址由內部讀寫指針自動加1完成。相比于一個同等緩存大小的數值,FIFO就是多管理了一個先進先出的功能,方便串口數據的存入和讀出。

Fifo在帶操作系統嵌入式軟件中都有現成的實現,但是在基礎的嵌入軟件中,我們可以自己實現一個。

#define UART1_IN_FIFO_SIZE 100 //接收串口隊列的深度#define UART1_OUT_FIFO_SIZE 250 //發送串口隊列的深度

//頭文件函數列表FIFO_EXT u8 uart1infifo_data[UART1_IN_FIFO_SIZE];#define uart1infifo_count (uart1infifo_GetCount())FIFO_EXT u16 uart1infifo_front;FIFO_EXT u16 uart1infifo_rear;FIFO_EXT void uart1infifo_Clear(void);FIFO_EXT void uart1infifo_DataIn(u8 d);FIFO_EXT u8 uart1infifo_DataOut(void);FIFO_EXT u16 uart1infifo_GetSpace(void);FIFO_EXT u16 uart1infifo_GetCount(void);

//獲取串口1接收隊列緩存數u16 uart1infifo_GetCount(void){ u16 countR,countF; countR = uart1infifo_rear; countF = uart1infifo_front; if (countR 》= countF) { return(countR - countF); } else { return(UART1_IN_FIFO_SIZE + countR - countF); }}//清空串口1接收隊列void uart1infifo_Clear(void){ uart1infifo_front = UART1_IN_FIFO_SIZE -1; uart1infifo_rear = uart1infifo_front;// uart1infifo_count = 0;}//串口1接收隊列入數據void uart1infifo_DataIn(u8 d){ if (uart1infifo_count 《 UART1_IN_FIFO_SIZE) { uart1infifo_rear = (uart1infifo_rear +1) % UART1_IN_FIFO_SIZE; uart1infifo_data[uart1infifo_rear] = d; }}//串口1接收隊列出數據u8 uart1infifo_DataOut(void){ if (uart1infifo_rear != uart1infifo_front) { uart1infifo_front = (uart1infifo_front +1) % UART1_IN_FIFO_SIZE; return(uart1infifo_data[uart1infifo_front]); } else { return(0xff); }}

為了節省篇幅,串口1發送隊列就不詳細描述了,在接收隊列的基礎上稍加修改即可。

03中斷收發串口

//串口發送函數 void SendDataToUart1(u8 * pData, u16 len){ u8 i; //串口發送隊列將慢,等待一下數據發送 while (1) { if (uart1outfifo_GetSpace() 》 len+5) { break; } else { i = 0; } } USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //關閉中斷,防止隊列的進出會同時進行 while (len --) { uart1outfifo_DataIn(*pData); pData ++; } USART_ITConfig(USART1, USART_IT_TXE, ENABLE);}

//串口處理函數void USART1_IRQHandler(void){ if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { uart1infifo_DataIn(USART_ReceiveData(USART1));//接收數據并放入串口接收隊列 //串口數據處理flag } else if (USART_GetFlagStatus(USART1, USART_FLAG_TXE)) { if (uart1outfifo_count 》 0) { USART_SendData(USART1, uart1outfifo_DataOut());//發隊列取出數據放入串口發送寄存器 } else { USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } }}

04串口數據處理

不定長數據包超時處理

在上節的“串口數據處理flag”處,加入超時的標記g_uartTimeOut = n;并在定時器中斷中倒計時g_uartTimeOut,減到0后,產生數據包處理標志gb_needDealUartPkg = 1。主循環掃到gb_needDealUartPkg是1后,讀出uart1infifo中的全部數據進行解包處理。

不定長數據包按內容格式處理

在上節的“串口數據處理flag”處,加入比對數據包格式的函數,當格式滿足要求時,將整個數據包存入數據包隊列(參照前面的串口數據接收函數,寫一個接收隊列,接收的數據為數據包結構體)。主循環掃描數據包隊列的緩存數,有就去處理。

定長數據包處理

主循環中掃描uart1infifo_count,當達到定長后,讀出uart1infifo中的定長數據進行解包處理。

編輯:jq

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

    關注

    5090

    文章

    19176

    瀏覽量

    306934
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62882
  • 數據包
    +關注

    關注

    0

    文章

    267

    瀏覽量

    24443
  • 串口數據
    +關注

    關注

    0

    文章

    33

    瀏覽量

    13916
  • 緩存器
    +關注

    關注

    0

    文章

    63

    瀏覽量

    11684

原文標題:嵌入式軟件中的串口收發隊列設計方法

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式機器學習的應用特性與軟件開發環境

    作者:DigiKey Editor 在許多嵌入式系統,必須采用嵌入式機器學習(Embedded Machine Learning)技術,這是指將機器學習模型部署在資源受限的設備(如微控制器、物聯網
    的頭像 發表于 01-25 17:05 ?49次閱讀
    <b class='flag-5'>嵌入式</b>機器學習的應用特性與<b class='flag-5'>軟件</b>開發環境

    LDO在嵌入式系統的應用 常見LDO故障及解決方法

    的應用及其常見故障和解決方法的概述。 應用場景 電源轉換 :LDO可以將電池電壓或其他電源電壓轉換為嵌入式系統所需的穩定電壓。 噪聲抑制 :LDO能有效降低電源線上的噪聲,為敏感的模擬電路提供干凈的電源。 功耗管理 :在低功耗應用
    的頭像 發表于 12-13 09:08 ?816次閱讀

    新手怎么學嵌入式?

    的運行機制。例如,了解數據結構的鏈表、棧和隊列,對于在嵌入式編程管理數據非常有幫助。 2. 選擇合適的編程語言 嵌入式開發中常用的編程
    發表于 12-12 10:51

    嵌入式系統開發的測試方法 嵌入式系統開發與AI結合應用

    嵌入式系統開發的測試方法 嵌入式系統開發是一個復雜的過程,涉及到硬件和軟件的緊密結合。測試是確保系統可靠性和性能的關鍵步驟。以下是一些常用
    的頭像 發表于 12-09 10:22 ?499次閱讀

    嵌入式系統開發與硬件的關系 嵌入式系統開發常見問題解決

    嵌入式系統開發與硬件的關系 嵌入式系統是專為特定應用設計的計算機系統,它們通常嵌入在所控制的設備。這些系統的關鍵特點是它們與硬件的緊密集成,這意味著
    的頭像 發表于 12-09 09:38 ?396次閱讀

    嵌入式學習建議

    對廣大渴望學習嵌入式系統的學子提出幾點基礎階段的學習建議: ①嵌入式系統軟件硬件密切相關,一定要打好軟硬件基礎。其實,只要找到正確的方法,加上努力,任何理工科學生,甚至非理工科學生,
    發表于 10-22 11:41

    什么是嵌入式?一文讀懂嵌入式主板

    在現代科技浪潮,嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式?嵌入式系統,顧名思義,是將計算機的硬件和軟件
    的頭像 發表于 10-16 10:14 ?1354次閱讀

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備執行專門任務。嵌入式主板如同是設備
    的頭像 發表于 09-30 10:05 ?773次閱讀

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

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

    嵌入式系統的實時操作系統

    嵌入式RTOS是嵌入式應用程序運行、相互交互和與外界通信的底層軟件機制。在本節,您將了解嵌入式軟件
    的頭像 發表于 08-20 11:28 ?532次閱讀

    嵌入式軟件開發與AI整合

    嵌入式軟件開發與AI整合是當前技術發展的重要趨勢之一。隨著人工智能技術的快速發展,嵌入式系統越來越多地集成了AI算法,以實現更復雜的智能功能。以下是關于
    的頭像 發表于 07-31 09:25 ?793次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>開發與AI整合

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

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

    嵌入式軟件設計的原則分享

    嵌入式軟件開發如果具有更好的閱讀性、擴展性以及維護性,就需要考慮很多因素。今天給大家分享幾個嵌入式軟件設計的原則。
    發表于 02-25 10:54 ?740次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>設計的原則分享

    嵌入式軟件開發應該掌握哪些知識?

    嵌入式軟件開發應該掌握哪些知識? 一、 什么是嵌入式軟件? 嵌入式軟件通常是指
    發表于 02-19 11:23

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

    “環形隊列”和“消息隊列”在嵌入式領域有應用非常廣泛,相信有經驗的嵌入式軟件工程師對它們都不陌生。
    的頭像 發表于 01-26 09:38 ?741次閱讀
    裸機中環形<b class='flag-5'>隊列</b>與RTOS<b class='flag-5'>中</b>消息<b class='flag-5'>隊列</b>有何區別呢?
    主站蜘蛛池模板: 国产AV99激情久久无码天堂 | 国产精品视频在线自在线 | 国产亚洲精品久久综合阿香蕉 | qvod 韩国| 国产学生无码中文视频一区 | 最近免费中文字幕MV免费高清 | 国产精品视频大全 | 一个人在线观看免费视频 | 久久极品视频 | 亚洲视频在线观看不卡 | yin荡体育课羞耻play双性 | 国产91专区 | 精品国产乱码久久久久久乱码 | 国产精品久久久久久久人热 | 老太婆性BBWBBW | 老司机午夜影院试看区 | 日本吃孕妇奶水免费观看 | 一区三区在线专区在线 | 成人a视频片在线观看免费 成人a毛片久久免费播放 | 亚洲AV久久久噜噜噜噜 | 在线视频一区二区三区在线播放 | 在野外被男人躁了一夜动图 | 麻豆国产99在线中文 | 依恋影院在线观看 | 最新国产三级在线不卡视频 | 麻豆狠色伊人亚洲综合网站 | 青柠在线观看视频在线高清完整 | 美国大臿蕉香蕉大视频 | 老人洗澡自拍xxx互摸 | 超碰在线97久久视频观看 | 久久妇女高潮几次MBA | 好吊妞国产欧美日韩视频 | 精品欧美18videosex欧美 | 国产在线不卡 | 在线亚洲中文精品第1页 | 9420高清完整版在线电影免费观看 | 免费观看激烈日板子 | 性做久久久久久久久浪潮 | 亚洲成 人a影院青久在线观看 | 男人边吃奶边摸边做刺激情话 | 91精品国产免费入口 |