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
",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,最后通过标志位标志结束这次接收结束达到不定长接收的目的。

原文地址:https://www.cnblogs.com/xingboy/p/12457154.html