HAL庫串口中斷接收


1.利用CubeMX配置串口1

(1)配置串口1波特率為9600,波特率設置的太高有時會收不到消息,我碰到過。然后開啟串口中斷,在中斷中接收數據。但是不要在中斷中處理數據,中斷中盡量少做一些事情 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117151546465-760941921.jpg)

2.編程中用到的函數

(1)HAL庫中提供了很多串口操作的函數,有輪詢模式收發,中斷模式收發和DMA模式收發,我這里用的是中斷模式 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117152634637-733885637.jpg) (2)這里用到的三個函數,我說一下他們的意思,其他函數類似 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); //該函數功能為開啟串口接收中斷,並指定存儲接收數據的緩存區,設置從串口接收的數據大小。這里要特別注意,該函數只有從串口接收到Size個數據后才會返回,不然會阻塞。 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); //該函數功能為發送數據到指定串口,pData為數據地址,Size為數據大小,Timeout為超時時間。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //該函數為串口接收完數據后的回調函數,在串口中斷中,會依次調用以下這些函數:USART1_IRQHandler(),HAL_UART_IRQHandler(&huart1),UART_Receive_IT(),HAL_UART_RxCpltCallback()。回調函數在主函數中可以自己實現,HAL庫只有定義,沒有具體實現,我們可以在回調函數中做一些處理,來處理我們得到的數據。

3.代碼實現

(1)這里做一個簡單的串口與上位機串口助手通信的實驗,將串口助手發送給開發板串口1的數據回發到串口助手。注意,在利用CubeMX生成的代碼進行編程時,自己添加的代碼一定要加在各種“BEGIN”和“END”之間。 (2)首先在main中設置全局變量uint8_t RxCounter1=0,RxBuffer1[50]={0},RxTemp1=0,F_Usart1=0;用來保存從串口收到的數據,F_Usart1為接收完成標志,在while中會一直檢測它是否變化,然后進行相關操作。RxTemp1為單緩沖區,接收一個字節時可用 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117161400924-742162294.jpg) (3)在main()函數中while()之前開啟串口接收中斷,填好相關參數,HAL_UART_Receive_IT(&huart1,&RxTemp1,1);這里這么設置,先把數據保存到RxTemp1,然后再在回調函數中保存到RxBuffer1中,是為了把串口發來的數據完整的存儲在RxBuffer1中,方便我進行其他處理 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117193658312-151646064.jpg) (4)實現回調函數,這里有兩種方法,方法一可以保存數據再進行操作,方法二直接發送數據,不進行操作,仔細看圖中注釋 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117193924518-2055357068.jpg) (5)在while中的處理 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117200437982-1957774276.jpg)

4.補充說明

(1)至此,串口實驗基本完成。在這里說一下我項目里碰到的另外一個問題,我里面有兩個串口通信要處理,先要在程序里發送數據到串口3,然后要把串口3反饋的內容進行一些處理后發送到串口1,這時候需要把開啟中斷函數里(HAL_UART_Receive_IT(&huart3,&RxBuffer3[RxCounter3++],1);)的數據緩沖區直接設為全局數組,然后回調函數里直接寫開啟中斷的函數即可,不再需要RxTemp1標志位,但是要注意每次程序發送數據后要 延遲200ms,不然數據會收不到。看圖中針對串口3的操作即可 ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117195002322-88334606.jpg)
![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117195051999-1217580915.jpg) ![](https://img2018.cnblogs.com/blog/1392333/201811/1392333-20181117195138369-506610281.jpg)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM