21147|53

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32USARTRX使用DMA接收的话,如何判断接收完一帧数据呢 [复制链接]

                                 STM32的USART1使用DMA方式接收数据,该如何判断是否接收完一帧数据呢,这个芯片没有看到有timeout中断
此帖出自stm32/stm8论坛

最新回复

                                 我知道了,有人或许根本没有明白 这里说的TIMEOUT功能的具体行为是什么。 应该解释一下。或者把ATMEL的ARM手册里的原话贴到这里,不然 有人根本就是在自以为是的胡说八道。  详情 回复 发表于 2011-1-27 22:31
点赞 关注
 

回复
举报

67

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

这个问题以前讨论过,请查查旧帖

                                  
此帖出自stm32/stm8论坛
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

在旧贴中找到

1)通过上层协议对话确定数据包的长度。
2)通常数据长度都是在数据包的开始,你可以用中断或DMA先把数据包的长度字段接收下来,再配置DMA传送长度传送剩下的数据。
是不是这两段,没有timeout没办法了,只能这样搞
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

4
 

是的,这是保证高效正确地传输数据的有效方法

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 

这样搞,很不爽

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 

是的,改变旧的不好的习惯确实不是一件容易的事情

                                 但长痛不如短痛。
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

7
 

香版太不厚道

明明是STM32功能上的缺陷,硬要说成是"旧的不好的习惯"

那么所有用16C550 TIMEOUT 功能的产品都是无法 "保证高效正确地传输数据" 的产品?

带FIFO的16C550出来了十几年,已经是串口的工业标准了,STM32没作到的功能,就算是"旧的不好的习惯"??

如果版主真的有作过通信产品,再来评论TIMEOUT这个功能也不迟
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 

我没有说UART带FIFO的功能不好,也没有说带TIMEOUT的功能不好

我是说传输不定长的数据包,需要依靠超时来保证正确地识别接收数据包,这样的习惯不好。

如果你看过以前的讨论,看过我以前的发言,就明白我的意思了。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

9
 

香水城是对的

串口都是必定和一个队列连接的,标准的驱动程序设计。这样,用中断还是DMA,有什么关系吗?
怎么检测队列中的数据,不是驱动程序干的事情。
此帖出自stm32/stm8论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

10
 

香版主说得不对

timeout不是习惯问题,而是软件鲁棒性的问题。
假设由于干扰,你接收了错误的包长度,怎么办?
假设由于通信对方错误,发了一半就不发了,难道你等到地老天荒?
假设由于线路错误,传丢了一个字节,也一直等?
所以,包长度和timeout应该是同时使用的。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

11
 

串口应该按字节来接收啊,至于数据包的timeout,由应用程序

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 

哈哈,如果说到软件鲁棒性的问题,STM32中有大量的定时器可

不一定非要把Timeout绑到UART模块上。

如果按照10楼的说法,所有的通信端口(I2C、SPI、USB、以太网)模块岂不都要捆绑Timeout功能。
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

13
 

TIMEOUT主要体现在FIFO中

                                 无FIFO和DMA,TIMEOUT就没意义了
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 

楼主想的太美了!

可以知道了传输数据的长度, 使用DMA 就可爽了啊!

是,如果是固定长度的通讯,DMA 功能 比  才16字节的FIFO 更爽!

哪你就用DMA 一个一个字节来传嘛,干嘛非要一驮。



此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

纯净的硅(中级)

15
 

把问题放大一点说

    timeout功能并不是串行通信专用,这是一种高可靠性软件设计习惯的问题。比如你申请一块内存,申请不到则阻塞,良好的习惯会顺手设定一个阻塞timeout时间,时间到以后,无论内存是否成功申请到,均退出阻塞状态。串口接收也一样,你需要接收一个20字节的数据包,你就把DMA配置成收到20字节就引发中断,而接收程序则被阻塞,CPU干别的事去了,良好的习惯会设定一个timeout,如果超时收不到20字节,则要做一些善后工作了。从这点说,timeout是系统设计的问题,与具体硬件并无关系,只要系统设计工程师要求,软硬件工程师就必须予以实现,即使硬件不支持,也要通过软件实现,不知所长为何要把timeout与fifo联系在一起。
    至于timeout功能在哪里实现,是由应用程序查询呢?还是由DMA模块实现?还是用专用定时器实现?还是绑定在uart模块中?则要根据实际的硬件和软件来决定。我个人感觉是timeout绑定在uart上最方便,楼主感觉不爽是有道理的,不是什么不良习惯。
    如果哪个CPU在I2C、SPI、USB、以太网这些模块中绑定timeout功能,这肯定是一个实用的功能。
此帖出自stm32/stm8论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

16
 

好!15楼说的很好

我非常赞同djyos的分析,非阻塞的程序设计是一个良好的习惯。

关于Timeout功能是否与硬件通讯模块绑定,这的确是一个芯片设计的问题,我也曾经提出过这个问题,也向设计工程师提出过,但我相信他们也考虑过这个问题。


从硬件设计的角度可以有这样的考虑:与其说把Timeout的功能绑定到各个硬件通讯模块上,不如单独把所有这些功能所占用的芯片面积集中起来,多做2个通用定时器;要知道,STM32上有多达5个UART,如果每一个都要绑定Timeout计时器,先不说能有多少精度,它们肯定占用不少芯片面积,如果一个应用中没有使用或较少使用UART,这部分功能就不能很好地被利用起来;现在我们单独把定时功能抽出来,由用户在需要的时候自由组合,提供灵活的空间,也不失为一个好的设计。

这样的设计可以比喻为软件上的通用子程序调用,而把Timeout的功能绑定到UART上相当于软件上函数的inline调用。通用子程序调用节省了代码空间,但执行速度和使用的方便程度比函数的inline调用方式略低,但一旦完成了这样的设计,下次使用只是简单地调用现成函数的问题了。

开始构造一个函数时可能麻烦些,但构造好函数后,用起来就很爽了。
此帖出自stm32/stm8论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

17
 

呵呵,兜个圈圈用定时器做timeout,肯定没有UART里面的timeout爽

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 

Timeout 功能没此必要。

发送 是基于  波特率 的过采样技术。
就是 数据位(流)不管变化否,采样都在进行中。它可不管你Timeout不Timeout。


STM32 已经给出了好多 错误的标志,

例如: NE: 噪声错误标志、FE: 帧错误 、IDLE:监测到IDLE总线等。

好好利用来判断,没必要使用 Timeout 功能。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 

有timeout,做Modbus_RTU协议就很方便了,没有就用定时器得了..

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

20
 

15楼:没分清此TimeOut和彼TimeOut

FIFO的TimeOut,是防止接收数据没达到FIFO的阀值,又有接收数据需要处理的情况下的一种解决方法。大家都知道,使用FIFO可以大幅度提高接收效率,FIFO的阀值要能接受范围内越高越好,但实际应用场合,比如单字节命令,只接收一个字节并需要处理时,FIFO阀值是总不触发的,这时候Timeout就可以起辅助作用。

15楼的彼TimeOut,是上层处理的TimeOut,比如TCP/IP的TimeOut。这是由其它方式产生的,比如查询、定时,队列阀值触发。

这是两个层次的问题,不能混为一谈。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表