關於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已經幫我們做好了,所以不用自己來弄了

 


免責聲明!

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



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