娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年05月31日(星期六)

2019年05月31日 | HAL庫教程6:串口數據接收

發布者:WanderlustGaze 來源: eefocus關鍵字:HAL庫  串口  數據接收 手機看文章 掃描二維碼
隨時隨地手機看文章

STM32的串口接收機制

??與阻塞式發送函數HAL_UART_Transmit配套,有個阻塞式的接收函數,HAL_UART_Receive,但此函數不常用,串口接收通常使用中斷函數HAL_UART_Receive_IT。HAL庫的串口中斷比較復雜,主要流程如下:

在這里插入圖片描述

??USART1_IRQHandler:由硬件調用,不是HAL庫函數,寄存器編程或固件庫編程也需要調用此函數;

??HAL_UART_IRQHandler:通過中斷類型(發送中斷還是接收中斷)來判斷調用哪個函數;

??UART_Receive_IT:此函數可以指定,每收到若干個數據,調用一次回調函數;這是因為,每收到一個字節,都會把此函數的接收計數器-1,如果接收計數器為零,調用串口接收回調函數HAL_UART_RxCpltCallback(實際上HAL庫一共提供了5個回調函數,只有這個函數在接收完成時調用)。

??HAL_UART_RxCpltCallback:弱函數,用戶可以在此函數中編寫業務邏輯。清除中斷標記,是中斷處理函數一定要做的事情,但是對于用戶函數,把這個操作給隱藏了


使能串口接收中斷

??由于串口不方便傳參數,所以我通常會定義一些用于串口通信的全局變量。也可以模仿庫函數,把這些變量打包成一個結構體。


//UART.c

unsigned char UART1_Rx_Buf[MAX_REC_LENGTH] = {0}; //USART1存儲接收數據

unsigned char UART1_Rx_flg = 0;                   //USART1接收完成標志

unsigned int  UART1_Rx_cnt = 0;                   //USART1接受數據計數器

unsigned char UART1_temp[REC_LENGTH] = {0};       //USART1接收數據緩存


??由于這些變量也要在main.c文件中使用,跨文件使用,可以在頭文件中做外部聲明:


#ifndef __UART_H

#define __UART_H


#ifdef __cplusplus

extern "C" {

#endif

  

#define REC_LENGTH  1

#define MAX_REC_LENGTH  1024 

  

extern unsigned char UART1_Rx_Buf[MAX_REC_LENGTH];

extern unsigned char UART1_Rx_flg ;

extern unsigned int  UART1_Rx_cnt ;

extern unsigned char UART1_temp[REC_LENGTH];

    

#ifdef __cplusplus

}

#endif


#endif 


??要使用中斷來接收串口數據,則必須開啟中斷。并且,每次處理完串口接收中斷以后,會自動關閉中斷,如果想循環接收數據,則必須在處理完中斷以后,再次開啟中斷。

??我們希望完成初始化以后就開始接收串口數據,所以要修改串口初始化函數。


//main.c

static void MX_USART1_UART_Init(void)

{

  /* USER CODE BEGIN USART1_Init 2 */

  HAL_UART_Receive_IT(&huart1,(uint8_t *)UART1_temp,REC_LENGTH);

  /* USER CODE END USART1_Init 2 */

}


串口接收中斷函數處理

??程序的邏輯:

在這里插入圖片描述

??如果接收到了指定數量的串口數據(在本例中,指定的數量是1字節),則會執行回調函數HAL_UART_RxCpltCallback。此函數是個弱函數,用戶可以根據業務邏輯來“重載”。我們要在此函數中,把串口收到的數據打包,并判斷結束符判斷數據結束。我們規定,只發送ASCII碼,并以0x0a作為結束符。


//UART.c

/**

  * @brief 串口中斷回調函數

  * @param 調用回調函數的串口

  * @note  串口每次收到數據以后都會關閉中斷,如需重復使用,必須再次開啟

  * @retval None

  */  

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  if(huart->Instance==USART1)

  {

    UART1_Rx_Buf[UART1_Rx_cnt] = UART1_temp[0];

    UART1_Rx_cnt++;

    if(0x0a == UART1_temp[0])

    {

      UART1_Rx_flg = 1;

    }

    HAL_UART_Receive_IT(&huart1,(uint8_t *)UART1_temp,REC_LENGTH);

  }

}

??主函數中,實現“串口應聲蟲”的功能,收到什么就發送什么。如果串口數據接收完成,則發送出去然后把數組,計數器,標志都恢復初始狀態。


//main() while(1)

    if(UART1_Rx_flg)

    {

      HAL_UART_Transmit(&huart1,UART1_Rx_Buf,UART1_Rx_cnt,0x10);    //發送接收到的數據

      for(int i = 0;i        UART1_Rx_Buf[i] = 0;

      UART1_Rx_cnt = 0;

      UART1_Rx_flg = 0;

    }   



??現象:向串口發送ASCII碼,單片機收到什么數據,就返回什么數據。注意,發送給串口的數據結尾要有回車鍵。


在這里插入圖片描述

數據階段的方法與ASCII碼

??一組數據怎么判斷是否結束?

??2種方法:

??1特定時間,特定的時間內沒有收到新的數據,認為這一組數據就結束了。這種方法在定時器的章節來實現。

??2特定字符,通信雙方約定,用特定的字符作為結束,比如把0xff作為結束符。收到0xff就把數據截斷。就像我們演講,最后說一句謝謝大家,下邊的人就知道了你講完了,該鼓掌了。謝謝就是結束符。

??但是這種做法有一個弊端,就是正常通信的數據不允許在使用0xff。

??對于ASCII碼,正常情況下是不會發送0x0d與0x0a(回車與換行)的,所以可以用作結束符。

??ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的系統,并等同于國際標準ISO/IEC 646。

??ASCII碼主要用于英文字符的顯示,不包含中文。標準ASCII碼只有7位(最高位是校驗位),所以只能顯示2^7=128個字符,其中0-31還是不能顯示的字符,例如回車,作用是控制字符或通信字符。

在這里插入圖片描述

??假如,發送的數據是0x31,它可能代表著十六進制的數字0x31,也可能表示十進制的數字49(十六進制與十進制雖然看上去不一樣,但表示的數是同樣的大小),還可能表示ASCII碼,字符’1’。這三者,在傳輸線上使用示波器來觀察,波形是一模一樣的,接收方把它理解為0x31還是理解為字符,要看通信雙方的約定。



關鍵字:HAL庫  串口  數據接收 引用地址:HAL庫教程6:串口數據接收

上一篇:HAL庫教程7:STM32的時鐘系統
下一篇:HAL庫教程5:串口數據發送

推薦閱讀

本月初,Facebook總裁扎克伯格于美國加州正式發布了Oculus旗下全新VR一體機產品——Oculus Go,這是首款小米和Oculus聯合打造的VR產品,發布伊始就獲得了海外媒體廣泛贊譽,《時代周刊》更是給出了“這才是VR該有的樣子”的評價同時獲得了《時代周刊》的年度最佳發明稱號。5月31日,針對本地優化、基于Oculus底層技術、采用相同硬件規格專為中國市場打造...
Jaguar Land Rover捷豹路虎開發了一種新的方向盤,該方向盤的設計使駕駛員能夠密切注視道路,并仍能從導航系統獲得指示和信息。方向盤將加熱和冷卻與導航結合使用。這項發明被稱為感官方向盤。 該裝置可以快速加熱或冷卻,以通知駕駛員轉向的位置、何時變換車道或警告何時接近道路交叉口。同樣的加熱和冷卻技術也應用于換檔撥桿,以指示何時將從駕駛員人...
在科幻電影中,機器人幫助太空人工作將變成現實。日本機器人新創公司Gitai正研發一項新技術,未來可將遠程臨場(lepresence)仿真機器人送至太空,代替太空人處理艱難任務,先前該公司與日本宇宙航空研究開發機構(JAXA)合作,對機器人的實用性進行研究。 據報導,送太空人執行任務既危險又昂貴,若能遙控半自動機器人代替這項工作,宇宙航空機構預估將節...
同時進行時域和頻域調試的功能在很多情況下是很有價值的。當您想要在電路板上調試多個位置的信號時,不同信號的時間相關性是必須要考慮的;然而,您在使用多臺測試儀器時會發現這是一項艱巨任務。混合域測量的另一個難題是查看頻率隨時間的變化。大多數示波器都能夠很好地查看時域和頻域測量,因為它們具有快速傅立葉變換功能;更進一步,Keysight In?nii...

史海拾趣

問答坊 | AI 解惑

東瓜的關于貨車用TPMS中RF方案的一點原創 (5)

東瓜的關于貨車用TPMS中RF方案的一點原創 (5)…

查看全部問答∨

產品使用報告格式

如題,哪位大俠有產品使用報告的格式呀??借來用用…

查看全部問答∨

顯示控制器論文大全

搜集了很多基于FPGA/CPLD的顯示控制器論文還有液晶顯示控制器芯片設計方面的論文 如附件兩張圖所示…

查看全部問答∨

探究CDC類的方法ExtTextOut 中的一個參數

virtual BOOL ExtTextOut ( int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount, LPINT lpDxWidths ); 想請教一下參數nOptions是否有效?本人通過測試,覺得ETO-CLIPPED、ETO-OPAQUE、NULL三者之間沒有 ...…

查看全部問答∨

VC++關于directshow圖像旋轉90度輸出花屏的問題

VC++關于directshow圖像旋轉90度輸出花屏的問題 我在transfilter對圖像做了一個90度的旋轉,再傳給第三個filter,發現圖像是花屏,解析度為176x144 如果解析度為高,寬相等就是正常的(如:240x240) 請問是什么原因?…

查看全部問答∨

求vxworks的ospf源碼 ?

求vxworks的ospf源碼,哪位大俠有?請給一份,先謝了! jorsen_gong@hotmai.com …

查看全部問答∨

急救 !!!!!!!!!!!!萬里求救!傳感器 單片機LED顯示設計電路圖

通過485 通信到485接口接收數據然后用(單片機)LED顯示     氣體濃度在0-0.5%是綠燈亮   0.5%-1%黃燈亮 蜂鳴器響且響的頻率慢       >=1%紅燈亮 蜂鳴器響且響的頻率快     用AT89c2051做 ...…

查看全部問答∨

大家新年好啦~~~~~~~~

                                 大家新年好啦~~~~~~~~ …

查看全部問答∨

2400構建電阻網絡的測試方法

一般情況下,電阻網絡的測試通常采用下列三類測量方法中的一類: „    標準四線開氏測量 „    六線防護式歐姆或德爾塔電阻測量 „    “Y”型或埋入式節點電阻測量(也稱為分離開 ...…

查看全部問答∨

為什么我在C2000培訓中考了很多次試,查看答卷和查看成績里邊都是空的,而且只有首...

為什么我在C2000培訓中考了很多次試,查看答卷和查看成績里邊都是空的,而且只有首次考試成績…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 上思县| 汝城县| 太仆寺旗| 洞头县| 贞丰县| 鄄城县| 镇巴县| 阳江市| 鄂托克旗| 洪雅县| 高雄市| 章丘市| 远安县| 麟游县| 长阳| 云霄县| 临沭县| 增城市| 波密县| 永善县| 噶尔县| 加查县| 塔城市| SHOW| 张家口市| 怀宁县| 农安县| 新巴尔虎左旗| 林周县| 日土县| 三门峡市| 茂名市| 宿迁市| 金山区| 汉沽区| 延边| 江永县| 江陵县| 永济市| 托克逊县| 山东省|