打印
[其他ST产品]

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

[复制链接]
1420|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 );

使用特权

评论回复
地板
欢乐家园| | 2024-12-31 23:34 | 只看该作者
可以通过调用HAL_UART_Receive_DMA重新启动DMA,或手动重置DMA指针。

使用特权

评论回复
5
冰春彩落下| | 2025-1-26 16:45 | 只看该作者
在使用DMA循环模式接收串口数据时,如果上位机发送的数据出现干扰(例如多发送了一个数据),会导致DMA缓冲区中的数据错位

使用特权

评论回复
6
江河千里| | 2025-1-27 02:00 | 只看该作者
根据你的描述,DMA循环模式会将数据覆盖写入缓冲区,因此需要手动调整DMA指针以恢复正确的数据顺序

使用特权

评论回复
7
光辉梦境| | 2025-1-27 03:00 | 只看该作者
DMA内部有一个自动递增的指针,用于跟踪当前写入位置。这个指针在循环模式下会自动回绕

使用特权

评论回复
8
一秒落纱| | 2025-1-27 04:00 | 只看该作者
DMA内部有一个自动递增的指针,用于跟踪当前写入位置。这个指针在循环模式下会自动回绕

使用特权

评论回复
9
夜阑风雨| | 2025-1-27 05:00 | 只看该作者
由于上位机多发送了一个数据(C),DMA指针的位置被提前,导致后续数据写入位置错位

使用特权

评论回复
10
远山寻你| | 2025-1-27 06:00 | 只看该作者
缓冲区内容变为 AAAB,且后续数据会继续按照这个错位的位置写入

使用特权

评论回复
11
三生万物| | 2025-1-27 07:00 | 只看该作者
重置DMA指针,可以通过重新配置DMA或手动调整DMA指针来恢复正确的数据顺序

使用特权

评论回复
12
淡漠安然| | 2025-1-27 08:00 | 只看该作者
检测数据错位,通过软件检测数据是否错位,并在检测到错位时进行纠正

使用特权

评论回复
13
暖了夏天蓝了海| | 2025-1-27 09:00 | 只看该作者
停止DMA,调用 HAL_UART_DMAStop(&huart1) 停止DMA传输

使用特权

评论回复
14
别乱了阵脚| | 2025-1-27 10:00 | 只看该作者
重新调用 HAL_UART_Receive_DMA(&huart1, buffer, 4),将DMA指针重置到缓冲区的起始位置

使用特权

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

本版积分规则

442

主题

1688

帖子

1

粉丝