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

  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/xingboy/p/12457154.html
Copyright © 2011-2022 走看看