OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6639|回复: 8

STM32F427 两个串口同时用DMA接收产生问题

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-6-21
在线时间
6 小时
发表于 2021-9-3 18:04:17 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 SUSTCstream 于 2021-9-3 20:14 编辑

STM32F427(Robomaster A板) 两个串口同时用DMA接收100Hz的传感器的数据,一个分别是六维力的传感器(六个数据),一个是IMU的数据
但在接收原始数据的时候,出现数据紊乱的问题

如上图,在keil上debug会出现一个诸如e+19等非常大的数据,同时传到上位机上效果更明显
并且只能保证一个传感器能够通过串口正常传输原始数据
之前听说是优先级的问题,并且两个串口中断可能会产生冲突,所以我采用的一个是定时器中断,另外一个是串口中断

调试了很多次,确定是原始数据发送到开发板上出现了问题,也就是最开始接收产生问题
本人刚入门单片机学习,想问一下如何用两个串口分别接收两个频率较大的数据啊?上述问题的产生会不会和串口溢出中断(ORE)有关?
9NAU{J05U1I8G6H3I07@Y]Q.png
EN0UZC8C0OCUK`3MD2~(33N.png
B23W@$I(`F34L%YPU]Z7FLV.png
755JY~QS)445N]C6BZUEF}X.png

最佳答案

查看完整内容[请看2#楼]

115200,一次传输31个字节,31*8.681us=269.1us 100HZ是10ms,传输一帧只占2.69%时间。 数据是一直不断传输的,帧与帧之间没有空字节,不代表不能IDLE中断。 只要串口连续10bit时间没有数据,就会进入IDLE中断,也就是说用269.1us 接收完31个字节后,再过86.8us没有数据就会进入空闲中断。空闲中断跟空字节一点关系也没有。 至于你说的怕丢失数据,这个你算法上弥补吧。单片机同一时刻只能处理一件事情。正在接收A传感器数据, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-9-3 18:04:18 | 显示全部楼层
115200,一次传输31个字节,31*8.681us=269.1us
100HZ是10ms,传输一帧只占2.69%时间。
数据是一直不断传输的,帧与帧之间没有空字节,不代表不能IDLE中断。
只要串口连续10bit时间没有数据,就会进入IDLE中断,也就是说用269.1us 接收完31个字节后,再过86.8us没有数据就会进入空闲中断。空闲中断跟空字节一点关系也没有。
至于你说的怕丢失数据,这个你算法上弥补吧。单片机同一时刻只能处理一件事情。正在接收A传感器数据,那B传感器数据来了就会丢失,如果B设置的优先级低的话。但是如果B设置的优先级高那就会丢失A的数据。这个是必然的。你可以改一下数据传输方式,使用查询方式,MCU询问哪个传感器,哪个传感器发来数据,超时几次没有发来数据就判定传感器故障。这种方式不会丢失数据。如果改不了查询方式只能用中断,那就加算法,把坏的数据剔除掉。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-6-21
在线时间
6 小时
 楼主| 发表于 2021-9-3 18:06:31 | 显示全部楼层
想问一下怎么上传图片
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-6-21
在线时间
6 小时
 楼主| 发表于 2021-9-3 18:07:33 | 显示全部楼层
D:\Desktop\755JY~QS)445N%5DC6BZUEF}X.png
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-9-6 01:26:59 | 显示全部楼层
你的串口波特率多少?1次总共传输多少字节?
要考虑你的两个串口能否忙得过来,DMA收完一帧进入IDLE中断后立即把数据取出来放到一个缓存里,然后再次打开DMA接收,同时你的MCU对上次收到的数据(已经存在另一个缓存里了)进行处理包括上传给上位机什么的。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-6-21
在线时间
6 小时
 楼主| 发表于 2021-9-7 18:45:09 | 显示全部楼层
c2007s 发表于 2021-9-6 01:26
你的串口波特率多少?1次总共传输多少字节?
要考虑你的两个串口能否忙得过来,DMA收完一帧进入IDLE中断后 ...

115200,一次传输31个字节,但为了保证缓冲区总有一帧完整的数据,所以缓冲区总共有61,并且数据是一直不断传输的,帧与帧之间没有空字节(这应该怎么进入空闲中断的状态?)
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-9-7 19:28:29 | 显示全部楼层
有可能是 串口并发数据过来。然后你定时器中断又到了 就去读取里面的数据。造成数据读取错误。。 建议是两个串口都开启空闲中断。进入了空闲中断 说明接收了一包数据,处理数据后 在开启接收。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2021-6-21
在线时间
6 小时
 楼主| 发表于 2021-9-7 19:47:46 | 显示全部楼层
wklhwkl 发表于 2021-9-7 19:28
有可能是 串口并发数据过来。然后你定时器中断又到了 就去读取里面的数据。造成数据读取错误。。 建议是两 ...

定时器确实,但我又担心如果两个传感器的数据都采用串口接收中断,会因为优先级的原因导致优先级低的数据可能会收不到,并且定时器中断是能够顺利接收到数据的(只有一个传感器和单片机串口连接的时候,两个就不行)。另外就是空闲中断,我想问一下除了接收空字节的条件之外,还有什么方式可以进入空闲中断(可见我上一层的回复),现在看来,进入空闲中断处理数据是惟一的方法了
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-9-8 17:57:09 | 显示全部楼层
SUSTCstream 发表于 2021-9-7 19:47
定时器确实,但我又担心如果两个传感器的数据都采用串口接收中断,会因为优先级的原因导致优先级低的数据 ...

超时判断。有数据他会一直进入中断。在中断一直把计数器清0、一旦计时器超过一定的时间 就说明接收完了一包数据。比如超时1-2ms就行。  还有就是不用担心什么优先级低就接收不到。而且你这个才100HZ。慢得很。 担心数据丢失,用DMA和空闲中断很好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表