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

2020-9-24 12:06 5737 32 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 2024-07-08 11:38
接地不良导致的故障分析
这个电路的控制板需要连接显示板和识别板。5V 供电和串行控制连到显示板,显示板再连接到识别板。识别板上电位器使用一个LDO供电,将输入的5V转成3.3V。当电位器滑动时,输出电压在0~3.3V之间。...
southcreek 2024-06-26 09:15
【EMC整改】带辅助加热的滴速控制器辐射抗扰整改
这个滴速式的输液泵使用一个红外线发射和接收装置,当有液滴通过时,会扰动检测信号,识别这个扰动检测到液滴滴下,获得滴壶中的液滴速度,调整阀门大小,实现输液速度控制。控制器还配备一根加热条,用于输液时对药...
southcreek 2024-06-06 08:52
QT 使用QSettings 操作ini文件配合表格操作
这个项目可以演示 使用QSetting 读取或写入 ini文件。并使用tablewidget 显示。Ini文件的格式如下,这个文件可以事先编写。也可以在程序中生成。有一个大类,下面有一个小类使用等号设...
southcreek 2024-05-27 16:18
差分输入ADC的单端到差分转换器驱动设计
单端信号需要转换成差分信号,以便使用ADC进行转换。这个就所谓的ADC驱动电路。需要的结果为Vp = Vcm + Vi/2Vn = Vcm – Vi/2这样 Vp – Vn = Vi使用简单的加法器和...
southcreek 2024-05-10 15:12
QT 使用 customplot实现绘图
从customPlot 官网下载需要的源文件。将qcustomplot类中的源文件加入到工程里。在工程文件中增加greaterThan(QT_MAJOR_VERSION, 4): QT += widg...
southcreek 2024-04-19 12:15
步进电机运动控制
这个项目使用步进电机高速启停并换向。需要在尽可能短时间完成相应的圈数。常用的线性加速启停的时候有很大的噪声。需要做一点运动控制。达到加速度变化连续的效果。7段加减速控制策略分t1~t7 7个阶段,A...
我要评论
1
32
关闭 站长推荐上一条 /2 下一条