1. 程式人生 > 其它 >關於stm2cumx生成的串列埠通訊USART的使用(2)

關於stm2cumx生成的串列埠通訊USART的使用(2)

上面一篇文章講到在stm32cumx開啟串列埠中斷後,系統每接收一個字元就會進入中斷一次

而使用HAL_UART_Receive_IT函式,可以設定我們進入回撥函式的條件,這樣我們就可以在回撥函式裡進行一大段字元的處理了

但有一個問題,HAL_UART_Receive_IT設定的接收字元數量是固定的,若我們每次接收的字串長度是不固定時,我們微控制器內就無法及時進入處理傳來資料的函式,除非每次接收的字元長度是固定的,這個方法還是有點不好用

這裡就用到第二個箭頭的函式HAL_UARTEx_ReceiveToIdle_IT,這個函式用到了串列埠暫存器的IDLE標誌位

先說說RXNE,RXNE標誌位是每接收到1bit資料,就會觸發一次串列埠中斷

而IDLE是空閒中斷的意思,即接收完1幀資料才會觸發一箇中斷

比如給上位機給微控制器一次性發送了8個位元組,就會產生8次RXNE中斷,1次IDLE中斷。

這個函式裡面箭頭處設定的標誌位,與上一篇裡面是不一樣的

然後在串列埠接收函式裡UART_Receive_IT,有個判斷的地方

因為我還沒有重寫這個回撥函式,所以第一個是不編譯的

可以看出,這個回撥函式,有個引數是串列埠物件的接收長度,通過這個引數,我們就可以在回撥函式中處理指定長度的字串,而不會越位

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    
if(huart->Instance==USART1) { serial.FramLength=Size; HAL_UART_Transmit(&huart1,serial.Rx_Data_Buf,serial.FramLength,serial.FramLength); HAL_UARTEx_ReceiveToIdle_IT(&huart1,serial.Rx_Data_Buf,RX_BUF_MAX_LEN); } }

同時要注意,這個也是需要在回撥函式中重新開啟(使能?)該中斷的

消除標誌位的方法,但stm32cumx已經幫我們做好了,所以不用自己來弄了