关于利用中断实现串口不长接收,最近发现了一种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 ",RxLine); for(int i=0;i<RxLine;i++) printf("UART DataBuff[%d] = 0x%x ",i,DataBuff[i]); memset(DataBuff,0,sizeof(DataBuff)); //清空缓存数组 RxLine=0; //清空接收长度 } RxBuff[0]=0; UHAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一个数据,就打开一次串口中断接收,否则只会接收一个数据就停止接收 }
实测结果如下图:
发送以下数据:
接收数据如下:
总结
其实这个方法主要是利用串口中断每次接收一个数据,这样就可以一个个数据处理,把每次接收到的数据保存在缓存BUFF,最后通过标志位标志结束这次接收结束达到不定长接收的目的。