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

2019-12-11 18:23发布

本帖最后由 12tangyang12 于 2019-5-7 06:18 编辑

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



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
37条回答
yy625
1楼-- · 2019-12-13 12:33
12tangyang12 发表于 2019-5-7 10:12
怎么个不合理法

满了之后如果再来一个数据,数据放哪?MCU的处理是需要时间的。
实际上直接用FIFO(深度至少是最大帧长度的2倍),不开DMA也是可以的。接收到直接进FIFO,然后在大循环或者任务中去取FIFO中的数据
NIC
2楼-- · 2019-12-13 13:51
wye11083 发表于 2019-5-7 07:27
骚年你把dma的buffer变成环形的不得了。另外,编译时开优化没?用o0当我没说。stm32一般要开os。 ...
stm32一般要开os。
请教这是什么原因,这个优化还跟DMA速度有关系吗
1a2b3c
3楼-- · 2019-12-13 14:17
12tangyang12 发表于 2019-5-7 11:02
这肯定没问题,实际上这样是不行的,如果传来101个字节呢?

那你的思路有问题,如果你这样的话双缓冲无济于事,哪怕是三缓冲也一样,如果你不知道送来的数据一帧有多长,那么环形接受吧,dma只是节省了点频繁中断的进出,最终数据帧的解析不是靠dma的方式能完成的
12tangyang12
4楼-- · 2019-12-13 18:49
 精彩回答 2  元偷偷看……
hyghyg1234
5楼-- · 2019-12-13 22:50
12tangyang12 发表于 2019-5-7 15:07
双buf ,可以一个接收数据,另一个在搬运出去。只要搬的速度比接收的快就可以了。 ...

那你处理的速度也跟得上才行,这种方式就不合理,101字节那你就需要设置更大的buf,不可能一包无限大的。
shangdawei
6楼-- · 2019-12-14 00:54
STM32实现USART+DMA接收未知长度的数据和发送
https://www.amobbs.com/thread-5486343-1-1.html
(出处: amoBBS 阿莫电子论坛)

看看这个帖子有用吗?

一周热门 更多>