硬汉嵌入式论坛

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

串口接收DMA+空闲中断实现任意字节接收问题

  [复制链接]

76

主题

237

回帖

465

积分

高级会员

积分
465
发表于 2022-4-7 10:36:13 | 显示全部楼层 |阅读模式
有大佬用过串口的接收空闲中断+DMA接收任意字节的方式吗?我看空闲中断貌似只有1个字符的间隙,在频繁接收大量字节数据的过程中会不会出现数据意外中断的情况?因为担心这个空闲时间的判定太短导致数据有可能被意外中断,所以一直都用的接收中断+定时器超时的方式。用过的感觉效果如何呀,稳定吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106435
QQ
发表于 2022-4-7 12:01:36 | 显示全部楼层
可以,我们一直是定时器超时+串口中断。

另外像G4,H7等系列串口硬件已经升级了,支持硬件超时参数配置。
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2022-4-7 14:08:06 | 显示全部楼层
eric2013 发表于 2022-4-7 12:01
可以,我们一直是定时器超时+串口中断。

另外像G4,H7等系列串口硬件已经升级了,支持硬件超时参数配置 ...

确实,L4+系列也有硬件的超时接收功能,挺好。但是F4这种想尝试空闲中断+DMA,但又感觉那个空闲时间太短不太靠谱,所以一直用的定时器超时+串口中断。
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2022-4-14 09:15:06 | 显示全部楼层
确实存在这个问题,发送方发送的数据字节之间的间隔稍大,这种方法就会崩溃
回复

使用道具 举报

332

主题

2031

回帖

3032

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3032
发表于 2022-4-14 10:40:48 | 显示全部楼层
可以用基本定时器的溢出中断作为串口的空闲判断。  每接收一个字节就把定时器计数清零一下;定时器溢出时,就结束一帧,开始处理数据。 基本定时器功能很少,别的地方用不到,做这个挺好的。
回复

使用道具 举报

4

主题

140

回帖

152

积分

初级会员

积分
152
发表于 2022-4-15 13:42:28 | 显示全部楼层
一般没有问题,除非是自定义的那种,连续发送一帧数据中的字节间隔时间太长
回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
 楼主| 发表于 2022-4-19 09:06:17 | 显示全部楼层
多谢各位的解答。
回复

使用道具 举报

5

主题

162

回帖

177

积分

初级会员

积分
177
发表于 2022-4-19 16:04:30 | 显示全部楼层
频繁接收不会意外触发空闲中断,我理解的空闲中断原理是在没有收到数据后出现一个字节的空闲时间才会触发,数据搬运工作由dma完成,空闲中断只是告诉你这一帧数据接收完了,所以在连续接收数据帧的帧间隔期间才会中断
比如115200波特率连续接收,上一帧的最后一个字节和下一帧的头字节间隔要大于86us才会中断,一帧内部无论多长都不会触发空闲中断,除非发送方中途停止发送
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2022-4-19 17:53:28 | 显示全部楼层
多串口的时候,都用定时器就太奢侈了。给每个串口分配一个计数器,依然采用DMA+帧中断的方式,帧中断中把这个计数器赋值(比如5),然后每ms去轮询这些计数器,如果计数器大于0则减一,如果减一后等于0则认为一帧数据已经收完。
回复

使用道具 举报

1

主题

15

回帖

18

积分

新手上路

积分
18
发表于 2022-5-11 08:56:34 | 显示全部楼层
DX3906 发表于 2022-4-19 16:04
频繁接收不会意外触发空闲中断,我理解的空闲中断原理是在没有收到数据后出现一个字节的空闲时间才会触发, ...

字节与字节之间的间隔大于86us太正常了,4G模块,Lora模块接收到的数据基本都不连续
回复

使用道具 举报

4

主题

22

回帖

34

积分

新手上路

积分
34
发表于 2022-6-17 14:51:37 | 显示全部楼层
AT32有个  AT32F415_由空闲中断来实现USART的DMA传送 案例,如附件,看看能达到看楼主需求不?

SC0076_AT32F415_USART_DMA_Transmission_by_Idle_Interrupt_ZH_V2.0.0.pdf

358.14 KB, 下载次数: 27

SC0076_AT32F415_USART_DMA_Transmission_by_Idle_Interrupt_V2.0.0.zip

638.55 KB, 下载次数: 17

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 11:40 , Processed in 0.203963 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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