打印

UART DMA的疑惑

[复制链接]
9197|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuannin|  楼主 | 2011-1-23 08:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的DMA是个好东西,AD和Uart发送用起来很爽,但是我在想,如果用DMA做UART的接收,情况就有点麻烦,如果全双工的,收到数据长度不确定怎么办?即使长度固定,由于某种原因对方的数据不完整,那就会导致后面的数据全部出错?当然可以用一个在数据位中永远不会出现的包头,或者数据包接收超时等办法来解决问题,那做起来感觉就不爽了,各位高人怎么做的?
沙发
sjnh| | 2011-1-24 08:39 | 只看该作者
前面讨论过了,很难解决,如果用MODBUS之类的协议,用DMA实现非常困难还是用中断吧

https://bbs.21ic.com/icview-109346-1-1.html

使用特权

评论回复
板凳
jgphu| | 2011-1-24 14:04 | 只看该作者
楼主说的有道理,最近我也在想这个问题。

使用特权

评论回复
地板
jgphu| | 2011-1-24 14:39 | 只看该作者
例如: 我要接收371个左右的字节(也有可能是400个,或500个字节(假想一下最多不会超过500个字节))的GPS数据流; 我设计DMA接收字节个数500个。这就意味我每次要等下一个数据流来的时候才可以中断。像https://bbs.21ic.com/icview-109346-1-1.html这个贴,香水城版主说的,可以用接收一半来防止中断后数据被重写的问题。但是我整理这些数据还是比较烦的一件事情。
第二: 如果采用未接收500个字节,用TIMEOUT的方法来处理数据,我不知道这个TIMEOUT该从什么地方开始计时。如果是DMA全接收中断,中断的时候已经是第二个数据流来的时候。如果是DMA接收一半中断,感觉还有一点可行性。
第三: 像楼主说的,如果是定长数据的话。也要看给你传数据的设备会不会传一些其它的不定长的数据给你才是。当然你可以说看帧头。因为很多都是帧头是固定的,可以先接收中断,再用DMA。感觉十分不爽。

使用特权

评论回复
5
香水城| | 2011-1-24 18:30 | 只看该作者
例如: 我要接收371个左右的字节(也有可能是400个,或500个字节(假想一下最多不会超过500个字节))的GPS数据流; 我设计DMA接收字节个数500个。这就意味我每次要等下一个数据流来的时候才可以中断。像http://bbs. ...
jgphu 发表于 2011-1-24 14:39


请问你的GPS数据流是多长时间才会有一次传输?波特率是多少?

很多情况下,通过分析数据流的时序,问题都是可以解决的,就看你动不动脑子。

使用特权

评论回复
6
xuannin|  楼主 | 2011-1-24 19:21 | 只看该作者
本帖最后由 xuannin 于 2011-1-24 19:24 编辑

https://bbs.21ic.com/icview-109346-1-1.html的帖子讨论的很精彩,最后我得出的结论:串口接收不适宜用DMA做。不必在这上面再浪费时间了,只是觉得很遗憾啊。

使用特权

评论回复
7
香水城| | 2011-1-25 10:52 | 只看该作者
https://bbs.21ic.com/icview-109346-1-1.html的帖子讨论的很精彩,最后我得出的结论:串口接收不适宜用DMA做。不必在这上面再浪费时间了,只是觉得很遗憾啊。
xuannin 发表于 2011-1-24 19:21


不要以偏概全,不适合你的应用方式,并不表示不适合所有人。

使用特权

评论回复
8
jgphu| | 2011-1-25 13:49 | 只看该作者
GPS 的波特率为9600 , 1S钟接收一次,  GPS数据流长度不定(300 - 500).

使用特权

评论回复
9
jgphu| | 2011-1-26 11:03 | 只看该作者
GPS数据:

$GPGGA,021742.861,2254.6369,N,11357.9861,E,1,04,4.2,42.1,M,-3.2,M,,0000*74
$GPGSA,A,3,10,05,28,17,,,,,,,,,6.8,4.2,5.3*34
$GPGSV,3,1,10,10,75,212,43,17,55,088,24,04,51,352,25,02,38,301,22*77
$GPGSV,3,2,10,05,27,218,31,13,24,126,,28,20,169,41,23,10,058,*7F
$GPGSV,3,3,10,20,02,039,,42,50,128,37*7E
$GPRMC,021742.861,A,2254.6369,N,11357.9861,E,0.22,106.66,240111,,,A*6F

我觉得还是直接用中断接收,比DMA接收更方便。

使用特权

评论回复
10
香水城| | 2011-1-26 17:58 | 只看该作者
GPS 的波特率为9600 , 1S钟接收一次,  GPS数据流长度不定(300 - 500).
jgphu 发表于 2011-1-25 13:49


你这个问题与我在另一个问题的分析方法一样:https://bbs.21ic.com/icview-215791-1-1.html

如果是9600的波特率,按800字节/秒计算,300字节需要440ms时间,500字节需要630ms时间。如果你把DMA传输长度设置为最长的500字节,甚至稍微多一些都可以,再把超时定时器设置在630ms或稍长一点,那么一定可以接收到所有长度的数据包,同时有足够的时间处理。

使用特权

评论回复
11
jgphu| | 2011-1-27 09:42 | 只看该作者
我想问一下:超时定时器在什么地方开始定时,如果设置接收一半中断的话,还可以知道已接收一半,从这个地方定时;如果设置全部接收中断,就不知道从何地方开始计时,更何谈TIMEOUT.

其实,DMA中断,串口中断只是两个方向而以,DMA中断操作起来会麻烦一点。串口中断会频繁进入中断。

使用特权

评论回复
12
香水城| | 2011-1-27 12:26 | 只看该作者
回10楼:从收到第一个字符开始计时可以吗?先使能接收中断,在第一个字符中断中开启计时,同时关闭USART接收中断。

使用特权

评论回复
13
小灰灰001| | 2016-12-18 11:55 | 只看该作者
可以采用队列加串口空闲中断的方式,进行Uart的DMA接收。如果后台速度太慢数据还是有被覆盖的可能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

174

帖子

3

粉丝