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

  • 相关阅读:
    iis 5.0 不能运行 asp.net 的 原因
    股票在线讨论
    adsl 加 路由器 网关不能上网的 原因
    汽车英语
    势与子的辩证法
    中国上海的黑心培训学校
    excel 里的 图表的使用
    带宽 下载速度 比特 率 换算 速度
    硬盘分区表修复秘籍
    Bootstrap a标签的单击时停止传播事件
  • 原文地址:https://www.cnblogs.com/xingboy/p/12457154.html
Copyright © 2011-2022 走看看