在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

分享關(guān)于嵌入式軟件中的串口收發(fā)隊(duì)列設(shè)計(jì)方法

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

01前言

嵌入式軟件的開(kāi)發(fā)中,串口是十分常用且基礎(chǔ)的功能。在需要批量發(fā)送數(shù)據(jù)的場(chǎng)合,可以使用while循環(huán)等待發(fā)送完成標(biāo)志位的方式,但是這種方式會(huì)占據(jù)主循環(huán),影響效率。也可以采用dma的方式,但是dma在發(fā)送數(shù)據(jù)時(shí)非常高效,但是批量接收數(shù)據(jù)時(shí),就很不靈活,特別是一些在串口數(shù)據(jù)中解析某種協(xié)議格式時(shí),很不方便。下面介紹一種利用串口中斷結(jié)合FIFO隊(duì)列的串口數(shù)據(jù)收發(fā)方法,結(jié)合了不阻塞批量發(fā)與靈活接收的優(yōu)點(diǎn),特別適用于串口協(xié)議收發(fā)的使用場(chǎng)景。

02FIFO隊(duì)列

FIFO是英文First In First Out 的縮寫(xiě),是一種先進(jìn)先出的數(shù)據(jù)緩存器,順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫(xiě)指針自動(dòng)加1完成。相比于一個(gè)同等緩存大小的數(shù)值,F(xiàn)IFO就是多管理了一個(gè)先進(jìn)先出的功能,方便串口數(shù)據(jù)的存入和讀出。

Fifo在帶操作系統(tǒng)嵌入式軟件中都有現(xiàn)成的實(shí)現(xiàn),但是在基礎(chǔ)的嵌入軟件中,我們可以自己實(shí)現(xiàn)一個(gè)。

#define UART1_IN_FIFO_SIZE 100 //接收串口隊(duì)列的深度#define UART1_OUT_FIFO_SIZE 250 //發(fā)送串口隊(duì)列的深度

//頭文件函數(shù)列表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接收隊(duì)列緩存數(shù)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接收隊(duì)列void uart1infifo_Clear(void){ uart1infifo_front = UART1_IN_FIFO_SIZE -1; uart1infifo_rear = uart1infifo_front;// uart1infifo_count = 0;}//串口1接收隊(duì)列入數(shù)據(jù)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接收隊(duì)列出數(shù)據(jù)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); }}

為了節(jié)省篇幅,串口1發(fā)送隊(duì)列就不詳細(xì)描述了,在接收隊(duì)列的基礎(chǔ)上稍加修改即可。

03中斷收發(fā)串口

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

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

04串口數(shù)據(jù)處理

不定長(zhǎng)數(shù)據(jù)包超時(shí)處理

在上節(jié)的“串口數(shù)據(jù)處理flag”處,加入超時(shí)的標(biāo)記g_uartTimeOut = n;并在定時(shí)器中斷中倒計(jì)時(shí)g_uartTimeOut,減到0后,產(chǎn)生數(shù)據(jù)包處理標(biāo)志gb_needDealUartPkg = 1。主循環(huán)掃到gb_needDealUartPkg是1后,讀出uart1infifo中的全部數(shù)據(jù)進(jìn)行解包處理。

不定長(zhǎng)數(shù)據(jù)包按內(nèi)容格式處理

在上節(jié)的“串口數(shù)據(jù)處理flag”處,加入比對(duì)數(shù)據(jù)包格式的函數(shù),當(dāng)格式滿足要求時(shí),將整個(gè)數(shù)據(jù)包存入數(shù)據(jù)包隊(duì)列(參照前面的串口數(shù)據(jù)接收函數(shù),寫(xiě)一個(gè)接收隊(duì)列,接收的數(shù)據(jù)為數(shù)據(jù)包結(jié)構(gòu)體)。主循環(huán)掃描數(shù)據(jù)包隊(duì)列的緩存數(shù),有就去處理。

定長(zhǎng)數(shù)據(jù)包處理

主循環(huán)中掃描uart1infifo_count,當(dāng)達(dá)到定長(zhǎng)后,讀出uart1infifo中的定長(zhǎng)數(shù)據(jù)進(jìn)行解包處理。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎ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)注

    5092

    文章

    19178

    瀏覽量

    307691
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

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

    關(guān)注

    0

    文章

    267

    瀏覽量

    24501
  • 串口數(shù)據(jù)
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    13923
  • 緩存器
    +關(guān)注

    關(guān)注

    0

    文章

    63

    瀏覽量

    11692

原文標(biāo)題:嵌入式軟件中的串口收發(fā)隊(duì)列設(shè)計(jì)方法

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式機(jī)器學(xué)習(xí)的應(yīng)用特性與軟件開(kāi)發(fā)環(huán)境

    作者:DigiKey Editor 在許多嵌入式系統(tǒng),必須采用嵌入式機(jī)器學(xué)習(xí)(Embedded Machine Learning)技術(shù),這是指將機(jī)器學(xué)習(xí)模型部署在資源受限的設(shè)備(如微控制器、物聯(lián)網(wǎng)
    的頭像 發(fā)表于 01-25 17:05 ?173次閱讀
    <b class='flag-5'>嵌入式</b>機(jī)器學(xué)習(xí)的應(yīng)用特性與<b class='flag-5'>軟件</b>開(kāi)發(fā)環(huán)境

    LDO在嵌入式系統(tǒng)的應(yīng)用 常見(jiàn)LDO故障及解決方法

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

    新手怎么學(xué)嵌入式?

    的運(yùn)行機(jī)制。例如,了解數(shù)據(jù)結(jié)構(gòu)的鏈表、棧和隊(duì)列,對(duì)于在嵌入式編程管理數(shù)據(jù)非常有幫助。 2. 選擇合適的編程語(yǔ)言 嵌入式開(kāi)發(fā)中常用的編程
    發(fā)表于 12-12 10:51

    嵌入式系統(tǒng)開(kāi)發(fā)的測(cè)試方法 嵌入式系統(tǒng)開(kāi)發(fā)與AI結(jié)合應(yīng)用

    嵌入式系統(tǒng)開(kāi)發(fā)的測(cè)試方法 嵌入式系統(tǒng)開(kāi)發(fā)是一個(gè)復(fù)雜的過(guò)程,涉及到硬件和軟件的緊密結(jié)合。測(cè)試是確保系統(tǒng)可靠性和性能的關(guān)鍵步驟。以下是一些常用
    的頭像 發(fā)表于 12-09 10:22 ?539次閱讀

    嵌入式系統(tǒng)開(kāi)發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)開(kāi)發(fā)常見(jiàn)問(wèn)題解決

    嵌入式系統(tǒng)開(kāi)發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)是專為特定應(yīng)用設(shè)計(jì)的計(jì)算機(jī)系統(tǒng),它們通常嵌入在所控制的設(shè)備。這些系統(tǒng)的關(guān)鍵特點(diǎn)是它們與硬件的緊密集成,這意味著
    的頭像 發(fā)表于 12-09 09:38 ?418次閱讀

    嵌入式學(xué)習(xí)建議

    對(duì)廣大渴望學(xué)習(xí)嵌入式系統(tǒng)的學(xué)子提出幾點(diǎn)基礎(chǔ)階段的學(xué)習(xí)建議: ①嵌入式系統(tǒng)軟件硬件密切相關(guān),一定要打好軟硬件基礎(chǔ)。其實(shí),只要找到正確的方法,加上努力,任何理工科學(xué)生,甚至非理工科學(xué)生,
    發(fā)表于 10-22 11:41

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

    在現(xiàn)代科技浪潮嵌入式技術(shù)已成為支撐各種智能設(shè)備和系統(tǒng)運(yùn)行的核心力量。那么,究竟什么是嵌入式嵌入式系統(tǒng),顧名思義,是將計(jì)算機(jī)的硬件和軟件
    的頭像 發(fā)表于 10-16 10:14 ?1582次閱讀

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

    嵌入式主板,通常被稱為嵌入式系統(tǒng)的核心組件,是一種用于控制和數(shù)據(jù)處理的計(jì)算機(jī)硬件,其設(shè)計(jì)旨在嵌入特定設(shè)備執(zhí)行專門任務(wù)。嵌入式主板如同是設(shè)備
    的頭像 發(fā)表于 09-30 10:05 ?976次閱讀

    嵌入式環(huán)形隊(duì)列與消息隊(duì)列的實(shí)現(xiàn)原理

    嵌入式環(huán)形隊(duì)列,也稱為環(huán)形緩沖區(qū)或循環(huán)隊(duì)列,是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),用于在固定大小的存儲(chǔ)區(qū)域中高效地存儲(chǔ)和訪問(wèn)數(shù)據(jù)。其主要特點(diǎn)包括固定大小的數(shù)組和兩個(gè)指針(頭指針和尾指針),分別指向
    的頭像 發(fā)表于 09-02 15:29 ?660次閱讀

    嵌入式系統(tǒng)的實(shí)時(shí)操作系統(tǒng)

    嵌入式RTOS是嵌入式應(yīng)用程序運(yùn)行、相互交互和與外界通信的底層軟件機(jī)制。在本節(jié),您將了解嵌入式軟件
    的頭像 發(fā)表于 08-20 11:28 ?547次閱讀

    嵌入式軟件開(kāi)發(fā)與AI整合

    嵌入式軟件開(kāi)發(fā)與AI整合是當(dāng)前技術(shù)發(fā)展的重要趨勢(shì)之一。隨著人工智能技術(shù)的快速發(fā)展,嵌入式系統(tǒng)越來(lái)越多地集成了AI算法,以實(shí)現(xiàn)更復(fù)雜的智能功能。以下是關(guān)于
    的頭像 發(fā)表于 07-31 09:25 ?833次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>開(kāi)發(fā)與AI整合

    玩轉(zhuǎn)RT-Thread之消息隊(duì)列的應(yīng)用

    嵌入式系統(tǒng)開(kāi)發(fā),實(shí)時(shí)處理串口和ADC數(shù)據(jù)是一項(xiàng)重要的任務(wù)。本文將介紹如何在RT-Thread實(shí)時(shí)操作系統(tǒng),利用消息隊(duì)列來(lái)同時(shí)處理來(lái)自
    的頭像 發(fā)表于 07-23 08:11 ?664次閱讀
    玩轉(zhuǎn)RT-Thread之消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術(shù)集成到嵌入式系統(tǒng)的一種解決方案。嵌入式系統(tǒng)是一種為特定應(yīng)用而設(shè)計(jì)的計(jì)算機(jī)系統(tǒng),它通常包括處理器、內(nèi)存、外設(shè)接口等組件,并且被
    的頭像 發(fā)表于 03-15 14:29 ?1381次閱讀

    嵌入式軟件設(shè)計(jì)的原則分享

    嵌入式軟件開(kāi)發(fā)如果具有更好的閱讀性、擴(kuò)展性以及維護(hù)性,就需要考慮很多因素。今天給大家分享幾個(gè)嵌入式軟件設(shè)計(jì)的原則。
    發(fā)表于 02-25 10:54 ?750次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b>設(shè)計(jì)的原則分享

    嵌入式軟件開(kāi)發(fā)應(yīng)該掌握哪些知識(shí)?

    嵌入式軟件開(kāi)發(fā)應(yīng)該掌握哪些知識(shí)? 一、 什么是嵌入式軟件嵌入式軟件通常是指
    發(fā)表于 02-19 11:23
    主站蜘蛛池模板: 色妞综合 | www一级毛片 | 欧美一级视频免费看 | 日韩天堂| 天天操天天射天天插 | 7777奇米影视 | 天天碰视频 | 国产乱码精品一区二区三区四川人 | 午夜小网站 | 精品久久久久久婷婷 | 四虎影院视频 | 免费日本黄色 | 亚洲一级色片 | 欧美精品xxxⅹ欧美 欧美精品高清在线xxxx | 狠色网| 欧美性黄色 | 1000又爽又黄禁片 | 又长又大又粗又硬3p免费视频 | 88av免费观看| 色香欲综合成人免费视频 | chinese国产一区二区 | 日本免费看黄 | 色www视频永久免费 色www视频永久免费软件 | 噜噜色网 | 99久免费精品视频在线观看2 | 高清欧美一级在线观看 | 欧美成人性色xxxxx视频大 | 日日日日人人人夜夜夜2017 | 伊在线视频 | 久久久久久人精品免费费看 | 成人亚洲欧美综合 | 色妞色综合久久夜夜 | 久青草免费视频手机在线观看 | 在线视频播放大全 | 在线观看免费黄视频 | 特级毛片免费视频播放 | 日本最新免费网站 | 在线免费观看黄色小视频 | 免费一级毛片无毒不卡 | 午夜欧美精品久久久久久久 | 91大神成人偷拍在线观看 |