原创 STM32 串口 DMA方式接收数据及数据处理方法

2020-9-24 12:06 1159 11 6 分类: MCU/ 嵌入式
通常我们都使用中断方式接收串口数据。用DMA方式接收,效率会更高。
先在CUBE中设置一下。

使用UART DMA接收功能,并使用 Circular模式。收到的数据将循环放在缓冲区里。

 

#define BUFFERSIZE 128

uint8_t Uart1RxBuf[BUFFERSIZE]; // 软件中定义一个接收缓冲区

uint16_t curchr,lastchr;    //指向当前未处理过的字符和最后一个字符。 

HAL_UART_Receive_DMA(&huart1,Uart1RxBuf,BUFFERSIZE); // 程序初始化时,需要启动一次UART DMA接收。 

/*  需要定时查询是否收到数据。*/

lastchr = BUFFERSIZE - hdma_usart1_rx.Instance->NDTR;  // NDTR 指示存储空间的剩余长度

    if(curchr != lastchr)

    {

      LEDRUNON();  // 指示收到一个数据包

      SerialParse(Uart1RxBuf,&curchr,lastchr);

}

 

SerialParse 寻找自定协议中的数据包的头和尾。 

因为数据是循环接收的,有可能一个数据包会分布在缓冲区尾部和头部。索引时,需要取模运算。

(data == 'E')&&(data[(i+1) % BUFFERSIZE] == 'R')&&(data[(i+2) % BUFFERSIZE] == 'R')

好处就是,串口一直接收着,不会丢掉任何数据,只要合理的缓冲区长度,并及时处理数据。能达到很高的速度且不丢包。

作者: southcreek, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-408807.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论1条评论)

登录后参与讨论

pidaneng 2020-9-25 20:55

学习了
相关推荐阅读
southcreek 2021-01-17 07:50
N76E003 改选为MS51FB9AE
如果在Keil C51中没有MS51的支持,需要下载最新的NULINK驱动安装在Device 选项中,由N76E003改选为MS51FB9AE在Target选项上将时钟改为16M如果程序中有与FLAS...
southcreek 2020-12-25 14:56
STM32 动态改变ADC采样通道
使用DMA 进行AD采样很方便,但需要事先设置好通道。如果有过程中希望修改通道,可以先做一个DeInit 然后设置不同的Rank[code]// Adc 通道配置 选择 vdc vbat preu p...
southcreek 2020-12-21 14:59
EEPROM 中存入不同格式数据
    设备运行参数,需要保存到EEPROM中。运行参数数据类型不确定,有可能正负,也有可能不同长度。而EEPROM只能字节寻址。 不同编译器,数据类型的表示方法各异,且字节...
southcreek 2020-12-02 16:42
触摸屏数字键盘的实现方法
基本思路是使用一个图片,定义图片上各个按键的相对位置以及文本框的相对位置。定义键盘的尺寸 当需要显示键盘时,将图片画出来。 当触屏按下时,计算按下的位置,进行相应操作。 所有按键的尺...
southcreek 2020-11-27 14:08
均值滤波前的数据离散性判断
求数据平均值时,增加方差计算,判定数据是否稳定未被干扰 单片机A/D采集到的数据需要滤波,防止有噪声。各种方法,平均值,中值不一而足。滤波前,应该对数据做一些判断,防止数据源本身错误,使滤波结果...
southcreek 2020-11-02 10:10
电磁兼容 EFT整改
机器做EFT测试故障,表现为液晶显示段错误,数码管闪,传感器异常。综合表现指向在施加 ±2000V 脉冲周期 100KHZ  分别注入 L N PE L+N L+PE N+PE后5V供电被干...
广告
我要评论
1
11
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /7 下一条