關於利用中斷實現串口不長接收,最近發現了一種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,最后通過標志位標志結束這次接收結束達到不定長接收的目的。