硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1478|回复: 15
收起左侧

[有问必答] STM32串口空闲DMA接收一帧数据分段问题

  [复制链接]

42

主题

81

回帖

207

积分

高级会员

积分
207
发表于 2022-11-22 17:40:32 | 显示全部楼层 |阅读模式
在项目中比较常见的一个问题:STM32串口空闲DMA接收一帧数据分段问题需求:波特率115200,接收不定长的数据,有些单片机发出的一帧数据会分包,例如:
1、发送2K的数据包,第一次发送了其中的500B数据,中间延迟了几十个ms,后面发出1500B的数据
2、对于我的单片机来说,我收到500B的数据后就进入了串口空闲中断,取出数据处理,发现校验不通过,丢弃
3、后面的1500B的数据又进入串口空闲中断,检验不对,丢弃。
导致这个配置数据被丢弃了
目标:
为了让能兼容以上情况,有什么好的办法吗
回复

使用道具 举报

42

主题

81

回帖

207

积分

高级会员

积分
207
 楼主| 发表于 2022-11-22 17:41:50 | 显示全部楼层
使用了操作系统,串口空闲里面,每收到一次数据都发到消息邮箱里面
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2022-11-22 20:37:17 | 显示全部楼层
分包的每一包最好都有完整的协议并支持包号索引,那一包错误就进行重发机制进行重发
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2022-11-24 20:44:56 | 显示全部楼层
2k,也不大,不分包好了
回复

使用道具 举报

42

主题

81

回帖

207

积分

高级会员

积分
207
 楼主| 发表于 2022-11-24 22:39:11 | 显示全部楼层
可能我没有表达清楚,是我的单片机接收2K数据的时候,出现了分包的情况,进了两次空闲中断,导致这个数据包被舍弃了,校验没通过
回复

使用道具 举报

42

主题

81

回帖

207

积分

高级会员

积分
207
 楼主| 发表于 2022-11-24 22:39:50 | 显示全部楼层
yklstudent 发表于 2022-11-24 20:44
2k,也不大,不分包好了

没有分包发的,接收数据的时候出现了分包
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2022-11-25 08:13:58 | 显示全部楼层
加首尾标记字节和校验,丢到fifo里,逻辑上分包吧
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2022-11-25 10:31:24 | 显示全部楼层
没用过ST的DMA。用AT91的DMA时,是在数据缓冲区满的时候触发中断,然后重新初始化DMA目标存储区指针指向缓冲区首地址。主程序要及时对缓冲区的数据做取出处理,以免处理前被覆盖。
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2022-11-25 10:44:13 | 显示全部楼层
justdying 发表于 2022-11-24 22:39
没有分包发的,接收数据的时候出现了分包

如果这数据帧有协议头和协议尾,那么就把队列取出的数据再建立一个全部缓冲区暂存队列数据,如果数据完整就处理;如果数据帧不完整,先扔暂存区不处理,等待下一包数据拼接后看完整性,数据完整了再解析。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2022-11-25 19:24:21 | 显示全部楼层
这明显是发送出现不连续现象了
回复

使用道具 举报

75

主题

684

回帖

909

积分

金牌会员

积分
909
发表于 2022-11-25 22:13:34 | 显示全部楼层
justdying 发表于 2022-11-24 22:39
可能我没有表达清楚,是我的单片机接收2K数据的时候,出现了分包的情况,进了两次空闲中断,导致这个数据包 ...

如果你的上位机有这种发送断断续续的问题,那就别使用空闲中断,自己开了定时器判断帧结束或者开FIFO通过逻辑分包
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2022-12-5 09:22:48 | 显示全部楼层
不要用硬件的空闲中断,定时几十ms为空闲状态再读数据。
回复

使用道具 举报

42

主题

81

回帖

207

积分

高级会员

积分
207
 楼主| 发表于 2022-12-11 22:54:11 | 显示全部楼层
庄永 发表于 2022-11-25 22:13
如果你的上位机有这种发送断断续续的问题,那就别使用空闲中断,自己开了定时器判断帧结束或者开FIFO通过 ...

那使用普通的接受中断接受么
回复

使用道具 举报

0

主题

20

回帖

20

积分

新手上路

积分
20
发表于 2023-1-13 09:55:00 | 显示全部楼层
是不是这个帖子了的这种改法
https://www.armbbs.cn/forum.php? ... 1&highlight=DMA


回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2023-1-13 15:13:23 | 显示全部楼层
旮旯旭 发表于 2022-11-25 10:44
如果这数据帧有协议头和协议尾,那么就把队列取出的数据再建立一个全部缓冲区暂存队列数据,如果数据完整 ...

认同这个建议
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2023-9-1 09:33:52 | 显示全部楼层
可以空闲中断中开启一个假定100ms定时器,定时器事件触发则表示一帧数据接收完成,期间有数据进来则清零定时器继续接收
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 06:46 , Processed in 0.272653 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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