17735|23

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串行通信怎么判断一帧数据发送完毕?设置一个时间间隔?过了这个时间间隔还没有数据来就可以判断一帧数据发送完成? [复制链接]

串行通信怎么判断一帧数据发送完毕?设置一个时间间隔?过了这个时间间隔还没有数据来就可以判断一帧数据发送完成?

最新回复

设置超时时间,我以前就是用这个判断的,很有效的  详情 回复 发表于 2010-2-27 16:15
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
弄个结束字符也不保险啊!万一那个结束字符铥了怎么办?或者接收接收字符出错了怎么办?

判断帧数据长度也不行啊,因为帧数据的长度不一定就可以完全正确地被接收到,万一丢了1/2个数据,通过判断帧数据的个数也不行啊!

还有没更好的方法?

帧数据是有固定的周期的,判断时间间隔是个好方法,但不知道怎么弄.比如3-5MS还没有数据来,应该是一帧数据发送完成了.但怎么来判断这个3-5MS呢?在中断里面记忆最后一个字节的时间?
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如果收发都是你做就好办。
数据帧可以这样:开始字符+数据内容+校验字符+结束字符
你的数据内容是ASCII,还是16进制?
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
一般都是通过开始符和结束符来判断一帧的开始和结束, 然后通过校验码来判断当前帧在传输的过程中是否有误.
你可以参考下modbus协议.
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 arm7000 的回复:
如果收发都是你做就好办。
数据帧可以这样:开始字符+数据内容+校验字符+结束字符
你的数据内容是ASCII,还是16进制?


这个没用的,丢了数据的话,这些定义都是不起作用的!!!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
校验失败了就重传...不管是什么接口的通信都是有校验机制的.. 否则无法保证通信是成功的
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

7
 
我也一直很困扰这个问题,使用时间间隔判断确实是个好办法,比如很多单片机上接收串口协议帧都有这么做.估计很多串行协议的物理层实现都可能用到这一方法.但有的时候,这是一个不太通用或者不太好实施的办法.
如果单从软件上来说,基本上程序设计得能够达到当前帧出错,不会影响下一帧接收就可以了.
仅仅判断结束字符肯定是不够的,比如某一帧的结束字符丢失了,肯定会影响下一帧的接收.
但是同时判断开始符,数据长度,校验,结束符还是可以做到收到错误帧时,不影响下一帧接收.
判断时间间隔可以启用一个定时器,当有数据来时就reset定时器,这样如果一直有数据接收,定时器永远也不会发生溢出中断.如果定时器溢出了,说明有足够长的时间没有接收到数据了,一帧也就结束了.
另外还可以固定帧的大小,也可以一定程度上解决这个问题,但是可能造成浪费.
不知道还有没有更好的办法啦.
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 reallyu 的回复:
我也一直很困扰这个问题,使用时间间隔判断确实是个好办法,比如很多单片机上接收串口协议帧都有这么做.估计很多串行协议的物理层实现都可能用到这一方法.但有的时候,这是一个不太通用或者不太好实施的办法.
如果单从软件上来说,基本上程序设计得能够达到当前帧出错,不会影响下一帧接收就可以了.
仅仅判断结束字符肯定是不够的,比如某一帧的结束字符丢失了,肯定会影响下一帧的接收.
但是同时判断开始符,数据长度,校验,结束符还是可以做到收到错误帧时,不影响下一帧接收.
判断时间间隔可以启用一个定时器,当有数据来时就reset定时器,这样如果一直有数据接收,定时器永远也不会发生溢出中断.如果定时器溢出了,说明有足够长的时间没有接收到数据了,一帧也就结束了.
另外还可以固定帧的大小,也可以一定程度上解决这个问题,但是可能造成浪费.
不知道还有没有更好的办法啦.


开个定时器也许是个不错的想法!!!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
WINCE下的流接口驱动能不能开定时器?没有窗体的情况下?该怎么用呢?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
应该与具体协议有关吧.
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 tcdzyq 的回复:
应该与具体协议有关吧.


协议只是定义具体的事物,我们这是个机制的问题.----就是怎么判断一帧结束了.
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
数据帧有没有结束、完不完整,就是靠自定协议

至于一串数据有没有发完,这是靠UART硬件接口(视UART控制器而定,硬件接口也有超时设定)和中断来保证的
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
串行数据什么时候去处理?肯定是一帧接收完成的时候去处理是最好的时候.一帧接收完成正好有一定的时间间隔可以用于处理.
那怎么判断一帧正好接收完成呢?我定个5MS再没数据来就判断为一帧结束好像有问题.
原理上是不应该有问题的.难道我这样的做法不对吗?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
如果没有接收完一帧就去处理,处理又会影响接收了.因为处理也是处理接收BUF,接收也是接到接收BUF里面去.
大家有没更好的方法?

按接收结束符来弄有问题,因为结束符有可能接收不到,接不到那永远都不处理了,垃圾数据就越来越多了.
按数据长度来弄也有问题,因为存在丢数据的可能,可能接不到固定的长度数据.
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

15
 
我记得做过类似的,是借鉴的PPP协议中的内容:PPP是用0x7E做帧的定界符,在第一个和第二个只间的数据就是一个完整的帧,如果当信息(数据)字段出现0x7E组合时,采用特殊字符填充。具体做法为将信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E).若信息字段中出现0x7D的字节,则将其转换为2字节的(0x7D,0x5D)。如果考虑到数据丢失,可以在结束符前设2个字节的校验码来校验一帧;或者限定帧的长度(如1450),出现超过1450的情况就可以认为是丢失的分界符。如果一直只有一个分界符,那就只好等着2012到达吧。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

16
 
再补充一点:如果想保证传输的正确性和效率,就可能需要借鉴一点TCPIP的原理,实现一个简单的超时重传机制,这个要引入SEQ/ACK机制。

以上是个人意见,但愿对楼主有帮助。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 15 楼 alien75 的回复:
再补充一点:如果想保证传输的正确性和效率,就可能需要借鉴一点TCPIP的原理,实现一个简单的超时重传机制,这个要引入SEQ/ACK机制。

以上是个人意见,但愿对楼主有帮助。


用ACK太麻烦了,一来一去费时间.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
还是 加入校验机制,失败了可根据设置,是否进行重传。

采用时间间隔,这种办法 是最后彻底没指望才会考虑用的。
首先它可移植性差,而且不一定有保证,移植操作系统后,多任务的OS,在执行不同优先级的任务时,你所用的延时不一定准确。

就算用定时器,也可能在特权任务中有更高优先级的中断还在处理,此时定时器也没用。


所以最可靠的、容易移植的还是 加入校验机制;

当然如果就是非常的软件中,用时间间隔也可以接受,毕竟太简单的程序中,用什么方法都可以实现。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

19
 
w我觉得这是协议的部分,可以根据外界因素定义协议的情况,
一般外界环境比较好的情况下,时没必要有复杂的协议的,当然就不会有大的可可能性丢失数据位
串口的数据流并不是很大,而且在232的协议上要求传输距离不能太远。
基本就不会出现你所说的问题。
要远距离传输,可以使用485芯片。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 zhaozhi0810 的回复:
w我觉得这是协议的部分,可以根据外界因素定义协议的情况,
一般外界环境比较好的情况下,时没必要有复杂的协议的,当然就不会有大的可可能性丢失数据位
串口的数据流并不是很大,而且在232的协议上要求传输距离不能太远。
基本就不会出现你所说的问题。
要远距离传输,可以使用485芯片。

是串行通信不单单指串口通信,串口通信应该是更稳定的。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表