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

2020-9-24 12:06 751 5 5 分类: 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 2020-10-13 09:53
NTC 热敏电阻线性化
NTC热敏电阻其阻值随温度变化,公式如下: 其中T为温度,Rref 为 25度时的标称值,Tref 为 25度,实际上这些温度都应该加上 273.15 转换为开氏温度。 B 参数是...
southcreek 2020-09-08 09:10
matlab 生成 测温电阻 Rt表
由B值可以推导出不同温度t下的电阻值 R = R0 * exp(B*(1/t - 1/T0)); 其中 R为温度 t 下的电阻值 R0 为25度时的电阻值 T0 为25度...
southcreek 2020-08-29 08:30
降低步进电机微步控制中断频率
使用timer 产生脉冲波形,控制步进电机转动。当使用微步方式时,脉冲频率等于整步频率乘以细分数。有时,我们需要每步进行处理,也就是在发出脉冲时,产生中断。对于常用的双极步进电机,最快的速度大概是20...
southcreek 2020-08-07 16:26
STM32 产生us延迟的方法
使用一个空闲不用的定时器,做如下设置,预分频设为0, 周期设置为 55520-1/* TIM7 init function */static void MX_TIM7_Init(void){ ...
southcreek 2020-08-06 15:07
DS18B20 感觉这个用起来好罗嗦
为了省下控制线,用单总线连接。用严格的定时来实现。一大堆时序和控制命令。不过估计调通驱动程序。只要一个GetTemprature()就能得到数据。芯片的性能还是靠谱的。...
广告
EE直播间
更多
我要评论
1
5
广告
关闭 热点推荐上一条 /6 下一条