上面一篇文章講到在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已經幫我們做好了,所以不用自己來弄了