打印
[应用相关]

STM32 USART RX使用DMA接收的话,如何判断接收完一帧数据呢

[复制链接]
楼主: axiom
手机看帖
扫描二维码
随时随地手机跟帖
21
kl818bc| | 2008-9-10 10:18 | 只看该作者 回帖奖励 |倒序浏览

把省略的加上去,这样所长就不会误解了

串口的timeout是接收的字节和下一个字节间的超时

串口的timeout对于串口的FIFO和DMA是同样的观念,差别在于串口的FIFO是固定可选的几个值的,串口的DMA的长度则是可变的

但是串口有timeout可以增加系统的鲁棒性,并不是串口有了DMA就不用timeout

-----------------------------------------------------------

还有,不是所有的串口都需要接收队列,尤其在有DMA的串口,可以用DMA+SRAM当成队列

当初串口用队列的目的,就是怕CPU来不及处理(不一定是慢,可能在忙别的事)

但是有了DMA,就可以把串口接收的数据先存在内存里,效果就和队列一样

使用特权

评论回复
22
农民讲习所| | 2008-9-10 11:29 | 只看该作者

何为一帧的概念

帧,包含完整结构信息的一组数据,是软件层次的概念。通常说的通信握手协议,就是帧的一个表现。把帧的协议制定的比较完善,能够容错,才能正确的和不遗失的检测。

使用特权

评论回复
23
alex74| | 2008-9-10 11:37 | 只看该作者

是。

这个确实是缺陷。
标准串口应该有timeout的。
不过现在所有内置串口都是没有timeout的

使用特权

评论回复
24
sheepbaa| | 2008-9-11 09:17 | 只看该作者

我觉得是缺陷

我觉得是缺陷.
虽然都能够实现数据传送.但是发送接收双方都变得繁琐了.

使用特权

评论回复
25
农民讲习所| | 2008-9-11 09:49 | 只看该作者

怎么可能是缺陷?

使用DMA是最先进的方法。DMA中没有TIMEOUT一说。
DMA直接将数据存入内存队列,代替了软件操作。有了DMA就不用考虑FIFO和中断。
对队列的操作,更没有TIMEOUT一说。

使用特权

评论回复
26
alex74| | 2008-9-12 09:36 | 只看该作者

就是缺陷

这个就是缺陷。
标准工业串口是必须要有timeout的。
串口是物理层,串口协议是不知道帧长短的。
没有timeout机制,就必须要配合协议层来确定帧长短,这样不是不可以,只不过混淆了通信层次造成代码混乱而已。
如果是以太网物理协议,物理层是可以知道帧长度的。所以以太网的dma用起来就很爽。而串口dma用起来确实不爽,会造成物理层代码和协议层代码的混乱。
不过话说回来,现有所有芯片的内置串口都是这个德行

使用特权

评论回复
27
农民讲习所| | 2008-9-12 09:45 | 只看该作者

LS走到死胡同了

你不会是在接收数据的时候同时开始解析数据包吧?如果是,那么你的做法是错误的。你的观点好象都是从这个角度思考出来的。

使用特权

评论回复
28
zuoyou| | 2008-9-12 15:06 | 只看该作者

re

书是不能随便出的,否则误人

使用特权

评论回复
29
athlon64fx| | 2008-9-15 08:25 | 只看该作者

只要可以实现,就不能说是缺陷。

如果要判断帧接收超时,即帧首字节到末字节的超时,串口+DMA+通用定时器可以实现。但是如果非要判断每个字节接收超时,就无法用DMA了,除非串口有超时功能。


(1)字节接收超时或帧接收超时
(2)高层协议的数据包接收超时
正如20楼所言属于不同“层”的问题。
个人认为高层有超时功能并不意味着就不需要低层超时功能。

使用特权

评论回复
30
zhangxk| | 2008-9-15 14:10 | 只看该作者

赞同20楼的

uart中FIFO的timeout主要是数据没达到触发阀值时保证数据的正常通信,就像20楼说的,这一点省去了程序的查询检测,在实际使用中非常方便。

使用特权

评论回复
31
lshlin| | 2008-9-15 14:46 | 只看该作者

呵呵

只能说各有自己的考虑,芯片设计者考虑了成本,芯片使用者则主要考虑使用方便。

使用特权

评论回复
32
cqbbgmg| | 2008-10-5 15:03 | 只看该作者

modbuse

晕哟,空闲标志不会用吗

使用特权

评论回复
33
kl818bc| | 2008-10-8 12:46 | 只看该作者

很多人搞混了

>> 俺前面说的很明白了,FIFO的TIMEOUT是FIFO才有的特性,是硬件上的。和软件系统一点关系也没有。 

居然说出了 "FIFO的TIMEOUT" 这个词

FIFO是一个和内存里的队列一样的东西,只是FIFO是硬件,不需要CPU来介入就可以保存16-128个接收进来的字节

原则上FIFO是静态的,和时间无关,顶多输出 满,1/2满,1/4满...,空 的状态,绝对没有TIMEOUT这个输出

有TIMEOUT的是串口的接收器,只是接收FIFO的输入一般是接在串口的接收器的输出,但是绝不能说是FIFO的TIMEOUT

>> 驱动程序和这个没关系。串口驱动设计,最终是要将数据移进队列中,这才
是正道。几乎所有的操作系统和好的程序结构都是如此的。

>> LS走到死胡同了 
>> 你不会是在接收数据的时候同时开始解析数据包吧?如果是,那么你的做法是错误的。你的观点好象都是从这个角度思考出来的。

在工业自动控制应用里,很多串口的数据都是在接收时直接处理了,尤其是内存很小或是CPU速度不是很快的单片机

还有,在自动化生产车间里,几百个传感器的串口每秒数十次数百次的数据输出,如果全部都要"将数据移进队列"不知要花多少成本

当然是接收到正常无误的数据,就丢了,有异常才"移进队列"向上回报

大概这些人,写上位机程序写多了,都不用考虑内存够不够用,也没有真正在大规模工控现场待过

才会说出"将数据移进队列中,这才是正道"的话,让我想到晋惠帝的"何不食肉糜"

使用特权

评论回复
34
wlq_9| | 2008-10-8 13:26 | 只看该作者

很明白嘛

有很多做单片机的兄弟,就认为串口就应该向16c550一样的,有硬件超时中断,处理起来方便.这在工控上用的确实很多.但是这样的应用,一般都是不分什么层的,根本就不存在驱动层和应用层,整个就是比较典型的单片机系统-------一个各部分高度相关,以寻求资源最省和效率最优.
另外一部分工程师,尤其是做过上位机的,程序就做的相当独立.串口就是一个字符型设备,驱动负责收发一个一个的字符,所谓的字节超时,对驱动来说,根本就不关我的事.驱动每接收一个/帧字节,就放入缓冲.处理数据是应用层的事情!包括帧数据失败检查(其中超时就是其实的一种错误).
不用想,资源中断的时候,肯定是第二种方法好!这也是现在的各种OS采用的方法.基于cortex这样的资源,硬件不设计成类16c550那种结构的串口,而采用DMA,完全是没什么可批判的..........如果你非要去比个高下,只能说不同的应用场合有不同的优势!

使用特权

评论回复
35
bhsdlmj| | 2009-6-2 14:35 | 只看该作者

习惯是一种可怕的力量!

-------------------------------------------培根

使用特权

评论回复
36
罗菜鸟| | 2010-9-7 13:43 | 只看该作者
这个确实是缺陷。标准串口应该有timeout的。不过现在所有内置串口都是没有timeout的
alex74 发表于 2008-9-10 11:37

你没有良好的编程习惯,驱动,协议,应用互补相干。我编程喜欢把串口收到的数据放进一个队列中,在中断外面把数据用getch读出来,可以连续读。比如开一个超时定时器,在1ms内如果读到N个字节,下一毫秒读到0个字节,就算超时。

使用特权

评论回复
37
PXJ_520| | 2010-9-12 19:12 | 只看该作者
:P

使用特权

评论回复
38
溜溜| | 2010-10-7 12:55 | 只看该作者
此帖时间跨度真长。我也忍不住说一句。
1. 非常理解LZ的痛苦,如果真没有TIMEOUT的功能的话,不能说是STM32的缺陷,但是较ATEML或intel 或大家说的那个SC16550的串行通行设备的设计比起来,显然至少在工控这一个常用串口的行业来说, STM32设计的有点不那么好用。
2.至于UART里有没有TIMEOUT这个功能 对程序的影响 我觉得 有肯定比没有好。
  有人说用定时器来实现不也一样么?
更有甚者 认为就应该用定时器来实现这一功能。
我想说,我从公司回家骑车走近路15分钟,可是我也可绕城一圈再回家,不也可以么,15个小时而已嘛。
当然这种情况没有这么夸张,但是如果用定时器,不管代码量大小的问题,也不管方便不方便的事,只想问这个定时器是不是得在指定的单位时间内 周期的去查询 这个状态呢,这个算不算开销? 相比有TIMEOUT功能的串口来说,这个开销就大了点吧。程序设计也繁琐了点吧。

另: 兵无常形,水无常势, 因时而变因势而变,根据CPU 的特点解决问题, 方法的好坏永远是建立在实际应用的基础上的。

刚看一下STM32的手册 好像那个Idle line interruption 就是可以用做TIMEOUT的吧?

使用特权

评论回复
39
kevin_ares| | 2010-10-8 17:22 | 只看该作者
真正做过东西的都知道这timeout的好处

那些只会耍嘴皮子的却只会强词夺理,大家都知道是谁...

使用特权

评论回复
40
溜溜| | 2010-10-9 14:24 | 只看该作者
呵呵,我也是在搜索 STM32 的SPI 有没有 类似于TIMEOUT 这个功能时看到这个帖子的。
STM32的SPI似乎是真的没有 TO 这个功能, 在SPI_SLAVE 接受不定长或未知长度数据时, 有点麻烦。

而看到ATMEL的ARM 中的SPI, 当你看到NSSR 这个中断功能时。你应该会感叹吧,ATMEL干的不错。

使用特权

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

本版积分规则