关于一个帧开始和结束的判断

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

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

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

还有没更好的方法?

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

 

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


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

 

 

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

 

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

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

 

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

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

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

 

 

我记得做过类似的,是借鉴的PPP协议中的内容:PPP是用0x7E做帧的定界符,在第一个和第二个只间的数据就是一个完整的帧,如果当信息(数据)字段出现0x7E组合时,采用特殊字符填充。具体做法为将信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E).若信息字段中出现0x7D的字节,则将其转换为2字节的(0x7D,0x5D)。如果考虑到数据丢失,可以在结束符前设2个字节的校验码来校验一帧;或者限定帧的长度(如1450),出现超过1450的情况就可以认为是丢失的分界符。如果一直只有一个分界符,那就只好等着2012到达吧。再补充一点:如果想保证传输的正确性和效率,就可能需要借鉴一点TCPIP的原理,实现一个简单的超时重传机制,这个要引入SEQ/ACK机制。

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

 

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

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

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


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

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

 

 

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

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

 

我的想法是,你先要在实验条件下确认,你的通信是不会出错的。
第二,你定义的通信协议要保证,即使有几帧数据丢包了,你的程序,依然能够稳健的运行

要处理数据的时候去判断CS线的状态?这样就知道串行通信还有没在发数据,CS线为低就不进行数据处理(忙),CS线为高就进行数据处理(不忙),把有效的数据拣出来,无效数据就去掉,处理到整个接收缓冲区一个数据都没有为止(增加程序的容错性,数据错误就直接扔掉,并不能影响下一帧数据的接收与处理),不知道这样是否可行,还得做实验验证一下!定个时间再处理可能存在不准的情况.不知道还有没更好的方法.

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值