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的操作即可  
