你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
ivvvvvvvve 提问时间:2024-10-18 22:22 / 已解决

配置DMA循环模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函数将串口数据循环发送到4个元素的buffer数组内,上位机20ms发送一次数据。理论上讲上位机发送数据的数量和顺序都是固定的——比如AABA,可是现在有干扰——有一次上位机多发送了一个数据——变成了CAABA,根据DMA循环原理,存到数组里的数据就变成了AAAB——并且还是根据DMA循环原理——数组里的数据至此之后永远都是AAAB,如何才能让它重新变成AABA呢?有没有办法能找到DMA自动递增的那个指针?把那个自动递增指针重新给它置零?

收藏 评论5 发布时间:2024-10-18 22:22

举报

5个回答
xmshao 最优答案 回答时间:2024-10-21 13:41:01
鉴于你目前的情况,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 );


我们只需开启IDLE中断,DMA中断就不要了。CubeMx是默认开启DMA传输中断,可以自行关闭。
rrr.png

STMCU-管管 回答时间:2024-10-21 08:34:58
将DMA配置为循环模式,这样DMA会在缓冲区满时自动回到缓冲区的开始处继续接收数据。这种方法适用于连续数据流的接收,可以避免数据丢失。
使用两个缓冲区,当一个缓冲区正在被处理时,DMA可以继续在另一个缓冲区中接收数据。这样可以避免因处理数据不及时而导致的数据覆盖问题。

ivvvvvvvve 回答时间:2024-11-1 12:10:08

xmshao 发表于 2024-10-21 13:41
鉴于你目前的情况,DMA循环接收,UART的发送偶尔产生噪声往往难免。这样导致数据错位就很难及时发现和剔除 ...

多谢多谢。话说是不是无法在cubemx里关闭dma中断啊?我看那个选项是灰色的

xmshao 回答时间:2024-11-1 13:14:09

ivvvvvvvve 发表于 2024-11-1 12:10
多谢多谢。话说是不是无法在cubemx里关闭dma中断啊?我看那个选项是灰色的
...

STM32CubeMx和库函数代码默认开启DMA的中断功能,在cubeMx配置NVIC的地方,可以关闭的。

image.png

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版