一种基于SLIP协议的完整数据帧的接收方法与流程

文档序号:20164004发布日期:2020-03-24 21:18阅读:1954来源:国知局
一种基于SLIP协议的完整数据帧的接收方法与流程
本发明属于串口通信
技术领域
,具体涉及一种基于slip协议的完整数据帧的接收方法。
背景技术
:串口通信是指串口按位(bit)发送和接收字节,尽管通信速率较慢,但是能在使用一根线发送数据的同时使用另一根线接收数据,简单实用,并且能够实现远距离通信。因此,在嵌入式系统内部,经常采用rs232串口通信作为各分系统之间的通信方式,并且通常在链路层采用slip协议(seriallineinternetprotocol,串行线路网际协议)来保证发送方与接收方数据的一致性。文献“一种基于slip协议的串行数据解析方法”,李逸楠、孙丽君、王欣、所玉君,科技与创新,2019年第4期,第25~28页和第30页,提出了一种基于c语言设计的串行数据解析方法。该方法将原始数据从内存中取出,按slip协议解析出帧头(0xc0)、帧尾(0xc0),最后按上层通信协议解析出有效数据内容。进行串口通信时,数据接收方每次接收到的数据帧可能是一个不完整的数据帧,此时就需要对接收到的数据帧的完整性进行判断,对不完整的数据帧进行存储与拼接,从而获得一个完整的数据帧。该文献中的完整数据帧的接收方法为:判断接收到的数据帧中最后一个0xc0是否就是本次接收到的数据帧的最后一个字节,如果是,说明本次接收到了一个完整的数据帧;如果不是,则说明本次接收到了一个不完整的数据帧,需要将最后一个0xc0之后的数据保存起来,拼接在下一周期接收到的数据帧之前。该完整数据帧的接收方法存在明显的缺陷:由于一个完整的slip数据帧是以0xc0为帧头、0xc0为帧尾,即使接收到的数据帧中最后一个0xc0就是本次接收到的数据帧的最后一个字节,也只能证明最后一个0xc0是帧尾,而无法证明接收到的数据帧中是否含有帧头,进而不能确保接收到的数据帧是一个完整的数据帧。技术实现要素:针对现有技术存在的问题,本发明所要解决的技术问题就是提供一种基于slip协议的完整数据帧的接收方法,它能够准确无误地接收以0xc0为帧头、0xc0为帧尾的完整数据帧,保证基于slip协议串行数据通信的接收可靠性。本发明所要解决的技术问题是通过这样的技术方案实现的,它包括以下步骤:步骤1、变量赋值;步骤2、从串口接收缓存区中读取出新的数据帧;步骤3、从读取出的数据帧中找出帧头和帧尾;步骤4、将帧头至帧尾之间的数据保存为一个完整的数据帧。由于通过步骤3确保从接收到的数据帧中找出帧头、帧尾,然后由步骤4将帧头至帧尾之间的数据保存为一个完整的数据帧,这样,接收的数据帧含有帧头和帧尾,符合完整slip数据帧的要求。与现有技术相比,本发明的优点是:实现了准确接收以0xc0为帧头、0xc0为帧尾的完整数据帧,保证了基于slip协议串行数据通信的接收可靠性。附图说明本发明的附图说明如下:图1为本发明的流程图。具体实施方式下面结合附图和实施例对本发明作进一步说明:为便于叙述,变量定义见表1:表1变量定义序号变量描述1intsingle=0;每个周期内读取出的数据帧的长度2inttotal=0;合并后的数据帧的长度3charflag_head=0;指示数据帧中是否包含帧头,0:不含,1:含4charflag_tail=0;指示数据帧中是否包含帧尾,0:不含,1:含5ucharbuffer[65535]={0x00};储存合并后的数据帧如图1所示,本发明包括以下步骤:步骤1、变量赋值对total、flag_head、flag_tail和single变量赋值,即令:flag_head=0、flag_tail=0、single=0。步骤2、从串口接收缓存区中读取出新的数据帧数据接收方周期性地从串口接收缓存区中读取出新的数据帧,将当前周期内读取出的串口数据帧的长度赋值给single,显然,每个周期内读取出的数据帧的长度一般是不相等的,因此,single的取值将随着每个周期内读取出的数据帧的长度的变化而变化。步骤3、从读取出的数据帧中找出帧头和帧尾在s31,若single>0,则执行s32;否则,返回执行步骤2;在s32,将读取出的串口数据帧,从数组buffer第total个字节所在位置起,按序存入数组buffer,且令total=total+single;在s33,若flag_head=0,执行s34,否则,执行s37;在s34,从数组buffer第1至第total个字节的数据中寻找帧头(即第一个0xc0);在数组buffer第1至第total个字节的范围内,从第1字节起,依次判断当前字节的数据是否等于0xc0,只要当前字节的数据等于0xc0,则立即停止寻找帧头。在s35,若找到帧头,执行s36;若没有找到帧头,则返回执行步骤2;在s36,记录帧头在数组buffer中的位置为x,令flag_head=1,然后执行s37;在s37,从数组buffer第x+1至第total个字节的数据中寻找帧尾(即第二个0xc0);在数组buffer第x+1至第total个字节的范围内,从第x+1字节起,依次判断当前字节的数据是否等于0xc0,只要当前字节的数据等于0xc0,则立即停止寻找帧尾。在s38,若找到帧尾,执行s39,若没有找到帧尾,则返回执行步骤2;在s39,记录帧尾在数组buffer中的位置为y,令flag_tail=1,执行步骤4;步骤4,将帧头至帧尾之间的数据保存为一个完整的数据帧将数组buffer中第x至第y个字节之间的数据保存为一个完整的数据帧,然后返回执行步骤1。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1