打印
[其他ST产品]

stm32 DMA串口接收到数组,数组元素顺序错乱怎么办?

[复制链接]
370|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-10-21 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
配置DMA循环模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函数将串口数据循环发送到4个元素的buffer数组内,上位机20ms发送一次数据。理论上讲上位机发送数据的数量和顺序都是固定的——比如AABA,可是现在有干扰——有一次上位机多发送了一个数据——变成了CAABA,根据DMA循环原理,存到数组里的数据就变成了AAAB——并且还是根据DMA循环原理——数组里的数据至此之后***都是AAAB,如何才能让它重新变成AABA呢?有没有办法能找到DMA自动递增的那个指针?把那个自动递增指针重新给它置零?

使用特权

评论回复
沙发
呐咯密密| | 2024-10-22 10:54 | 只看该作者
可以获取DMA通道传输数量

使用特权

评论回复
板凳
香水城| | 2024-10-29 09:55 | 只看该作者
鉴于你目前的情况,DMA循环接收,UART的发送偶尔产生噪声往往难免。这样导致数据错位就很难及时发现和剔除。

只要偶尔乱一个数据,往往会没完没了地传递下去。

建议你使用DMA Normal模式进行UART数据的接收,将一轮接收的数据个数适当设置大点,比方正常是5个数据,我们

可以将DMA接收size设置为8或10个,比方:

HAL_UARTEx_ReceiveToIdle_DMA(&huart2, (uint8_t *)RXData, 10 );

同时将IDLE事件作为接收结束条件,在中断里查询接收的个数,如果数据不是指定个数

则视为异常接收。若刚好是指定个数视为正常接收。每次空闲事件中断后,开启下一轮数据的DMA接收。

即重新调用 HAL_UARTEx_ReceiveToIdle_DMA(&huart2, (uint8_t *)RXData, 10 );

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

426

主题

1581

帖子

1

粉丝