STM32 實現串口不定長數據接收(HAL庫版--方法2)


  關於利用中斷實現串口不長接收,最近發現了一種HAL版的方法,實現的方法跟我另一篇博客(https://www.cnblogs.com/xingboy/p/10154475.html)的方法類似,不過這個方法更加便捷,完全利用HAL庫,下面說一下具體的實現方式。

1、使用STM32CubeMx建立一個工程,工程打開串口,以及開啟串口中斷,關於時鍾選擇內外時鍾都不影響,時鍾就根據自己的具體項目配置即可。

2、新建一些數組備用

uint8_t RxBuff[1];      //進入中斷接收數據的數組
uint8_t DataBuff[5000]; //保存接收到的數據的數組
int RxLine=0;           //接收到的數據長度

3、在main函數里的while循環前利用下面函數開啟串口接收中斷

HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //打開串口中斷接收

4、重寫串口接收中斷回調函數

void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{
    RxLine++;                      //每接收到一個數據,進入回調數據長度加1
    DataBuff[RxLine-1]=RxBuff[0];  //把每次接收到的數據保存到緩存數組 if(RxBuff[0]==0xff)            //接收結束標志位,這個數據可以自定義,根據實際需求,這里只做示例使用,不一定是0xff
    {
        printf("RXLen=%d\r\n",RxLine); 
        for(int i=0;i<RxLine;i++)
          printf("UART DataBuff[%d] = 0x%x\r\n",i,DataBuff[i]);                            
        memset(DataBuff,0,sizeof(DataBuff));  //清空緩存數組
        RxLine=0;  //清空接收長度
    }
    
    RxBuff[0]=0;
    UHAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一個數據,就打開一次串口中斷接收,否則只會接收一個數據就停止接收
}

實測結果如下圖:

  發送以下數據:

  

  接收數據如下:

  

 總結

  其實這個方法主要是利用串口中斷每次接收一個數據,這樣就可以一個個數據處理,把每次接收到的數據保存在緩存BUFF,最后通過標志位標志結束這次接收結束達到不定長接收的目的。


免責聲明!

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



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