使用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
版权声明:本文为博主原创,未经本人允许,禁止转载!
pidaneng 2020-9-25 20:55