搜索
bottom↓
回复: 37

请教分析下DMA串口接收为啥来不及处理数据

[复制链接]

出0入8汤圆

发表于 2019-5-7 06:16:59 | 显示全部楼层 |阅读模式
本帖最后由 12tangyang12 于 2019-5-7 06:18 编辑

情况是这样的:主控是stm32f103c8t6,72M ,串口115200 bps 接收采用DMA 方式,buf 是10字节。接收到数据后会有空闲中断 或者是 接受满中断。
DAM 采用普通单次方式接收。问题是这样:接收超过10字节数据时“1234567890ab” 首先触发了DMA完成中断,然后在中断里会把数据存入FIFO,在存的时候DMA是关闭状态,导致后面的"a"会漏掉。
最终收到的是1234567890b。请大家分析下,怎么处理



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2019-5-7 06:23:39 | 显示全部楼层
楼上当大家算命的,给个八字就来卜卦?

出0入8汤圆

 楼主| 发表于 2019-5-7 06:43:37 来自手机 | 显示全部楼层
9509238 发表于 2019-5-7 06:23
楼上当大家算命的,给个八字就来卜卦?

当然是把大家当成大神了。
把波特率降到9600bps 则不会丢数据,是不是115200太快了,从DMA到FIFO太费时间导致漏了

出0入442汤圆

发表于 2019-5-7 07:27:47 来自手机 | 显示全部楼层
12tangyang12 发表于 2019-5-7 06:43
当然是把大家当成大神了。
把波特率降到9600bps 则不会丢数据,是不是115200太快了,从DMA到FIFO太费时间 ...

骚年你把dma的buffer变成环形的不得了。另外,编译时开优化没?用o0当我没说。stm32一般要开os。

出0入0汤圆

发表于 2019-5-7 07:28:25 来自手机 | 显示全部楼层
你程序处理不够快吧!DMA完成表示收到10个字符了,此时到下一个字符接收有1和字符的时间也就是100us左右处理数据重开DMA,100us够了吧,除非你被耽搁了。如果你处理花时间太多,直接把DMA缓存改大也可以。

出0入0汤圆

发表于 2019-5-7 07:33:04 来自手机 | 显示全部楼层
fifo才10个字节你发大于10个,当你去搬移这十个字节dma是关闭,除非这个时间非常短,不然很容易出问题,fifo通常要大于一帧长度

出0入8汤圆

 楼主| 发表于 2019-5-7 07:52:08 来自手机 | 显示全部楼层
wye11083 发表于 2019-5-7 07:27
骚年你把dma的buffer变成环形的不得了。另外,编译时开优化没?用o0当我没说。stm32一般要开os。 ...

变成环形后,通道的数据计数器不计了,这样就不知道传来多少个新数据

出0入8汤圆

 楼主| 发表于 2019-5-7 07:53:23 来自手机 | 显示全部楼层
wye11083 发表于 2019-5-7 07:27
骚年你把dma的buffer变成环形的不得了。另外,编译时开优化没?用o0当我没说。stm32一般要开os。 ...

没开优化

出0入0汤圆

发表于 2019-5-7 08:01:26 | 显示全部楼层
你dma接收,buffer开大一些,开半buffer dma中断,或者2个buffer,循环接收

出0入8汤圆

 楼主| 发表于 2019-5-7 08:48:25 来自手机 | 显示全部楼层
xiaomu 发表于 2019-5-7 08:01
你dma接收,buffer开大一些,开半buffer dma中断,或者2个buffer,循环接收

请问两个buffer怎么操作,是:设置第一个,接收完成中断里设置成第二个,并开始搬第一个的数据,第二个接收完成设置成第一个,并开始搬第一个的数据交替着来?
遇到空闲中断,直接把当前缓冲区数据搬走?

出0入0汤圆

发表于 2019-5-7 09:00:11 | 显示全部楼层
12tangyang12 发表于 2019-5-7 08:48
请问两个buffer怎么操作,是:设置第一个,接收完成中断里设置成第二个,并开始搬第一个的数据,第二个接 ...

对的, 就是这样子, buff长一些,留给你处理的时间就长一些,这样可以均衡处理和接收的时间,

出0入0汤圆

发表于 2019-5-7 09:03:02 | 显示全部楼层
连续数据传输,满中断是不合理的吧,要用半满中断

出0入8汤圆

 楼主| 发表于 2019-5-7 10:12:11 来自手机 | 显示全部楼层
yy625 发表于 2019-5-7 09:03
连续数据传输,满中断是不合理的吧,要用半满中断

怎么个不合理法

出0入475汤圆

发表于 2019-5-7 10:26:44 来自手机 | 显示全部楼层
按照你这点数据,我就是一个字节中断一次难道还搞不定?如果dma的思路不熟悉就干脆不用吧,单字节中断计数到第十个字节的时候就复制到另外的缓冲去处理,简简单单的,以前51的思路,

出0入8汤圆

 楼主| 发表于 2019-5-7 10:31:11 来自手机 | 显示全部楼层
xiaomu 发表于 2019-5-7 09:00
对的, 就是这样子, buff长一些,留给你处理的时间就长一些,这样可以均衡处理和接收的时间,

...

怎么感觉,buf长,搬运用的时间也长,速度快到一定程度就来不及搬了

出0入8汤圆

 楼主| 发表于 2019-5-7 10:38:22 来自手机 | 显示全部楼层
1a2b3c 发表于 2019-5-7 10:26
按照你这点数据,我就是一个字节中断一次难道还搞不定?如果dma的思路不熟悉就干脆不用吧,单字节中断计数 ...

就是要用DMA,准备用楼上xiao'mu的双buf,方案

出0入0汤圆

发表于 2019-5-7 10:43:59 来自手机 | 显示全部楼层
你把dma缓冲区开到100字节,然后等串口的空闲中断,我不信还会出你的问题。

出0入0汤圆

发表于 2019-5-7 10:44:41 来自手机 | 显示全部楼层
如果你只等空闲中断,字母a肯定没了。

出0入8汤圆

 楼主| 发表于 2019-5-7 11:02:51 来自手机 | 显示全部楼层
XA144F 发表于 2019-5-7 10:43
你把dma缓冲区开到100字节,然后等串口的空闲中断,我不信还会出你的问题。 ...

这肯定没问题,实际上这样是不行的,如果传来101个字节呢?

出0入0汤圆

发表于 2019-5-7 11:47:40 | 显示全部楼层

满了之后如果再来一个数据,数据放哪?MCU的处理是需要时间的。
实际上直接用FIFO(深度至少是最大帧长度的2倍),不开DMA也是可以的。接收到直接进FIFO,然后在大循环或者任务中去取FIFO中的数据

出0入0汤圆

发表于 2019-5-7 12:17:00 | 显示全部楼层
wye11083 发表于 2019-5-7 07:27
骚年你把dma的buffer变成环形的不得了。另外,编译时开优化没?用o0当我没说。stm32一般要开os。 ...
stm32一般要开os。
请教这是什么原因,这个优化还跟DMA速度有关系吗

出0入475汤圆

发表于 2019-5-7 12:18:42 来自手机 | 显示全部楼层
12tangyang12 发表于 2019-5-7 11:02
这肯定没问题,实际上这样是不行的,如果传来101个字节呢?

那你的思路有问题,如果你这样的话双缓冲无济于事,哪怕是三缓冲也一样,如果你不知道送来的数据一帧有多长,那么环形接受吧,dma只是节省了点频繁中断的进出,最终数据帧的解析不是靠dma的方式能完成的

出0入8汤圆

 楼主| 发表于 2019-5-7 15:07:05 | 显示全部楼层
1a2b3c 发表于 2019-5-7 12:18
那你的思路有问题,如果你这样的话双缓冲无济于事,哪怕是三缓冲也一样,如果你不知道送来的数据一帧有多 ...

双buf ,可以一个接收数据,另一个在搬运出去。只要搬的速度比接收的快就可以了。

出0入0汤圆

发表于 2019-5-7 15:38:45 | 显示全部楼层
12tangyang12 发表于 2019-5-7 15:07
双buf ,可以一个接收数据,另一个在搬运出去。只要搬的速度比接收的快就可以了。 ...

那你处理的速度也跟得上才行,这种方式就不合理,101字节那你就需要设置更大的buf,不可能一包无限大的。

出0入0汤圆

发表于 2019-5-7 16:40:37 | 显示全部楼层
STM32实现USART+DMA接收未知长度的数据和发送
https://www.amobbs.com/thread-5486343-1-1.html
(出处: amoBBS 阿莫电子论坛)

看看这个帖子有用吗?

出0入0汤圆

发表于 2019-5-7 16:53:44 | 显示全部楼层
AN3109: Communication peripheral FIFO emulation with DMA and DMA timeout in STM32F10x microcontrollers.


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-5-8 16:16:58 | 显示全部楼层
利用DMA+空闲中断实现了不定长接收,中断内接收到数据填入到环形缓冲队列,主函数不停消耗队列。这样还丢,就当我没说

出0入0汤圆

发表于 2019-5-9 10:46:01 | 显示全部楼层
环形缓冲区可以的,我一直再用,没发现问题

出0入4汤圆

发表于 2019-5-9 12:09:11 | 显示全部楼层
要用dma就要双用buffer或者half中断,不过我还是改用环形了

出0入8汤圆

 楼主| 发表于 2019-5-9 14:55:56 | 显示全部楼层
liuqian 发表于 2019-5-9 12:09
要用dma就要双用buffer或者half中断,不过我还是改用环形了

环形的话,如果一帧数据 比环形区大,还没等到空闲中断,数据没搬走,环形区冲了 怎么处理?

出0入475汤圆

发表于 2019-5-9 16:13:34 来自手机 | 显示全部楼层
12tangyang12 发表于 2019-5-9 14:55
环形的话,如果一帧数据 比环形区大,还没等到空闲中断,数据没搬走,环形区冲了 怎么处理? ...

还是那句话,你要接受什么内容你都不知道的吗?总的有个预估。如果是标准协议或者约定协议,传什么早就知道的。照你这个说法还是放弃吧,你永远都会有反对的理由 :)

出0入8汤圆

 楼主| 发表于 2019-5-9 16:15:02 | 显示全部楼层
1a2b3c 发表于 2019-5-9 16:13
还是那句话,你要接受什么内容你都不知道的吗?总的有个预估。如果是标准协议或者约定协议,传什么早就知 ...

就是 说  缓冲区 必须得 比 一帧数据 长

出0入475汤圆

发表于 2019-5-9 16:16:26 来自手机 | 显示全部楼层
补一刀,,,按你的说法来反驳你:如果你的一帧数据比较大的话,就把环形缓冲区的长度比数据多一个字节就好了,这样永远也不会溢出:)

出0入475汤圆

发表于 2019-5-9 16:17:11 来自手机 | 显示全部楼层
12tangyang12 发表于 2019-5-9 16:15
就是 说  缓冲区 必须得 比 一帧数据 长

晕,你动作快,我手机太慢了

出0入475汤圆

发表于 2019-5-9 16:18:46 来自手机 | 显示全部楼层
12tangyang12 发表于 2019-5-9 16:15
就是 说  缓冲区 必须得 比 一帧数据 长

可是dma只有64k深度(一般STM32芯片),你一帧报文有65k,咋办? 哈哈

出0入8汤圆

 楼主| 发表于 2019-5-9 16:22:10 | 显示全部楼层
1a2b3c 发表于 2019-5-9 16:18
可是dma只有64k深度(一般STM32芯片),你一帧报文有65k,咋办? 哈哈

这道是个问题,这样直接用中断接收

出0入475汤圆

发表于 2019-5-9 16:30:08 | 显示全部楼层
12tangyang12 发表于 2019-5-9 16:22
这道是个问题,这样直接用中断接收

真是服了你了啊,,,

前面网友都说了,半满中断什么的为啥不用? 莫非你也怕把单片机累着,必须得等他把一帧完整的报文收完了才允许中断呀
半满总没有你单字节中断累嘛,,,而且方法一样的,都是把缓冲里的数据复制到外面去,你单字节也是,只是复制的一个字节

好了,我知道你是故意在调戏我,我知趣了

出0入362汤圆

发表于 2019-5-9 17:55:11 | 显示全部楼层
本帖最后由 tomzbj 于 2019-5-9 17:56 编辑

连续接收?还是半满中断吧,然后前后两半分别处理

不连续接收的话,只用空闲中断就够了。缓冲区开大点,f103c8有20k ram吧,来个1024或者2048字节的缓冲区,你的一帧数据能有多长?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-27 03:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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