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

  • 相关阅读:
    C# json字符串格式
    JS网页换肤
    JS 播放列表收缩展开
    js学习系列之-----apply和call
    JS下拉图片Demo3
    算法---001
    inline-block 左边固定,右边自适应
    css3动画特效:上下晃动的div
    通过js写一个消息弹框
    css3 操作动画要点
  • 原文地址:https://www.cnblogs.com/xingboy/p/12457154.html
Copyright © 2020-2023  润新知