1. 程式人生 > >HAL庫串列埠中斷接收

HAL庫串列埠中斷接收

1.利用CubeMX配置串列埠1

(1)配置串列埠1波特率為9600,波特率設定的太高有時會收不到訊息,我碰到過。然後開啟串列埠中斷,在中斷中接收資料。但是不要在中斷中處理資料,中斷中儘量少做一些事情



2.程式設計中用到的函式


(1)HAL庫中提供了很多串列埠操作的函式,有輪詢模式收發,中斷模式收發和DMA模式收發,我這裡用的是中斷模式

(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為單緩衝區,接收一個位元組時可用

(3)在main()函式中while()之前開啟串列埠接收中斷,填好相關引數,HAL_UART_Receive_IT(&huart1,&RxTemp1,1);這裡這麼設定,先把資料儲存到RxTemp1,然後再在回撥函式中儲存到RxBuffer1中,是為了把串列埠發來的資料完整的儲存在RxBuffer1中,方便我進行其他處理

(4)實現回撥函式,這裡有兩種方法,方法一可以儲存資料再進行操作,方法二直接傳送資料,不進行操作,仔細看圖中註釋

(5)在while中的處理



4.補充說明


(1)至此,串列埠實驗基本完成。在這裡說一下我專案裡碰到的另外一個問題,我裡面有兩個串列埠通訊要處理,先要在程式裡傳送資料到串列埠3,然後要把串列埠3反饋的內容進行一些處理後傳送到串列埠1,這時候需要把開啟中斷函式裡(HAL_UART_Receive_IT(&huart3,&RxBuffer3[RxCounter3++],1);)的資料緩衝區直接設為全域性陣列,然後回撥函式裡直接寫開啟中斷的函式即可,不再需要RxTemp1標誌位,但是要注意每次程式傳送資料後要 延遲200ms,不然資料會收不到。看圖中針對串列埠3的操作即可