一种基于数据流传输的数据包提取方法

文档序号:9304518阅读:454来源:国知局
一种基于数据流传输的数据包提取方法
【技术领域】
[0001] 本发明涉及基于数据流传输的数据包提取方法。
【背景技术】
[0002] 在嵌入式系统中,很多通信接口可以提供一种数据流传输的功能,如串口、SPI总 线等,这种通信接口能够以数据为单位进行信息传递。一个完整的数据包通过这种通信接 口后,会转化为数据流的形式进行传输,数据接收端需在数据流中将数据包完整无误地提 取出来。与PC相比,嵌入式系统中RAM容量小、CPU主频低。但实际应用中系统资源占用 大、运算量大以及因硬件故障造成的数据包串位现象;所以,在嵌入式系统中,一种系统资 源占用少、运算量小,避免因硬件故障造成的数据包串位的数据包提取方法是必须的。

【发明内容】

[0003] 本发明的目的是为了解决现有系统资源占用大、运算量大以及因硬件故障造成的 数据包串位现象的问题,而提出了 一种基于数据流传输的数据包提取方法。
[0004] 上述的发明目的是通过以下技术方案实现的:
[0005] 步骤1、初始化各变量,执行解包进度等于0,队列头位置等于缓存首位置,队列尾 位置等于缓存首位置,同步字位置等于空值,数据包位置等于空值;
[0006] 步骤2、若接收队列中存在数据,则读取接收数据,赋值队列尾位置的数据等于接 收数据,队列尾位置等于队列尾位置+1,当前接收数据的长度等于队列尾位置减去队列头 位置,执行步骤3;
[0007] 若接收队列中不存在数据,则执行步骤5 ;
[0008] 步骤3、判断解包进度值,若解包进度等于0,执行步骤4. 0. 1 ;
[0009] 若解包进度等于1,执行步骤4. 1. 1 ;
[0010] 若解包进度等于2,执行步骤4. 2. 1;
[0011] 步骤4. 0. 1、若当前接收数据的长度大于等于同步字长度,则执行步骤4. 0. 2,
[0012] 若当前接收数据的长度小于同步字长度,则执行步骤2 ;
[0013] 步骤4. 0.2、在队列头位置到队列尾位置之间寻找同步字,若寻找到,设寻找到的 位置为寻找到的同步字位置,执行步骤4. 0. 3;
[0014] 若没寻找到,执行步骤4.0?4;
[0015] 步骤4. 0. 3、赋值解包进度等于1,同步字位置等于寻找到的同步字位置,数据包 位置等于同步字位置加同步字长度,执行步骤2;
[0016] 步骤4. 0. 4、赋值队列头位置等于队列头位置加1,若队列头位置大于等于重更新 缓存阈值,则执行步骤4. 0. 5;
[0017] 若队列头位置小于重更新缓存阈值,执行步骤2 ;
[0018] 步骤4. 0. 5、复制队列尾位置减同步字长度加1位置同步字长度减1个数据到缓存 首位置位置,赋值队列头位置等于缓存首位置(,队列尾位置等于队列头位置加同步字长度 减1,执行步骤2 ;
[0019] 步骤4. 1. 1、若当前接收数据的长度大于等于同步字长度加2,则执行步骤4. 1. 2 ;
[0020] 若当前接收数据的长度小于同步字长度加2,则执行步骤2 ;
[0021] 步骤4. 1. 2、若数据包位置长度位校验成功,赋值解包进度等于2,然后执行步骤 2,
[0022] 若数据包位置长度位校验不成功,赋值解包进度等于0,队列头位置等于队列头位 置加1,然后执行步骤2;
[0023] 步骤4. 2. 1、若当前接收数据的长度大于等于同步字长度加数据包位置的第一个 数据,则执行步骤4. 2. 2;
[0024] 若当前接收数据的长度小于同步字长度加数据包位置的第一个数据,则执行步骤 2 ;
[0025] 步骤4. 2. 2、若数据包位置数据包校验成功,执行步骤4. 2. 3;
[0026] 若数据包位置数据包校验不成功,执行步骤4. 2. 4;
[0027] 步骤4. 2. 3、复制数据包位置处数据包位置的第一个数据数目的数据到交换缓存 区,设置数据包接收标志,赋值解包进度等于〇,队列头位置等于缓存首位置,队列尾位置等 于缓存首位置,执行步骤5;
[0028] 步骤4. 2. 4、赋值解包进度等于0,队列头位置等于队列头位置加1,执行步骤2;
[0029] 步骤5、退出程序。
[0030] 发明效果
[0031] 采用本发明的一种基于数据流传输的数据包提取方法,
[0032] 本发明针对数据包格式和数据流传输的特点,提供了一种数据包提取算法,该算 法可以在数据流中提取数据包,采用基于队列存储结构实现,队列存储结构采用非循环结 构,降低运算量,达到系统资源占用内存小,运算量小;对错误数据采用逐数据删除的方式, 避免了因硬件故障造成的数据包串位现象;各变量具有明确意义,调试方便。解决了现有系 统资源占用大、运算量大以及因硬件故障造成的数据包出现串位现象的问题,使系统资源 占用减少30%以上,运算量减少40%以上。
【附图说明】
[0033] 图1为初始化赋值示意图;
[0034] 图2为主体流程图,子步骤0为步骤4. 0. 1-4. 0. 5,子步骤1为步骤4. 1. 1-4. 1. 2, 子步骤2为步骤4. 2. 1-4. 2. 4;
[0035] 图3为子步骤0流程图;
[0036] 图4为子步骤1流程图;
[0037] 图5为子步骤2流程图;
[0038] 图6为实施例中发送数据内容图;
[0039] 图7a为数据包处理前buffer缓存中存储的数据图;
[0040] 图7b为数据包处理前其余变量的状态图;
[0041] 图8a为数据包处理后buffer缓存中存储的数据图;
[0042] 图8b为数据包处理后其余变量的状态图。
【具体实施方式】
【具体实施方式】 [0043] 一:一种基于数据流传输的数据包提取方法具体是按照以下步骤进 行的:
[0044] 步骤1、如图1所示,初始化各变量,执行解包进度等于0(state= 0),队列头位置 等于缓存首(front=buffer),队列尾位置等于缓存首(rear=buffer),同步字位置等于 空值(sync=NULL),数据包位置等于空值(package=NULL),各变量为解包进度(state)、 队列头位置(front)、缓存首位置(buffer)、队列尾位置(rear)、同步字位置(sync)、(空 值)NULL和数据包位置(package);
[0045]步骤2、若接收队列中存在数据,则读取数据接收的数据(c),赋值队列尾位置的 数据等于接收的数据(*rear=c),队列尾位置等于队列尾位置+1(rear=rear+1),当前 接收数据的长度等于队列尾位置-队列头位置(recv_length=rear-front),执行步骤3;
[0046] 若接收队列中不存在数据,则执行步骤5 ;
[0047] 步骤3、如图2所示,判断解包进度(state)值,若解包进度等于0(state= 0),执 行步骤4. 0. 1;
[0048]若解包进度等于1(state= 1),执行步骤4. 1. 1;
[0049]若解包进度等于2(state= 2),执行步骤4. 2. 1;
[0050] 步骤4.0. 1、如图3所示,若当前接收数据的长度大于等于同步字长度(reCV_ length〉=PACK_SYNC_LEN),则执行步骤4.0? 2,
[0051]若当前接收数据的长度小于同步字长度(reCV_length<PACK_SYNC_LEN),则执 行步骤2;
[0052] 步骤4.0.2、在队列头位置(front)到队列尾位置(rear)之间寻找同步字(PACK_ SYNC),若寻找到,设寻找到的位置为寻找到的同步字位置(pos),执行步骤4.0.3;
[0053] 若没寻找到,执行步骤4.0?4;
[0054]步骤4. 0. 3、赋值解包进度等于1 (state=1),同步字位置等于寻找到的同步字位 置(sync=pos),数据包位置等于同步字位置加同步字长度(package=sync+PACK_SYNC_ LEN),执行步骤2 ;
[0055] 步骤4. 0. 4、赋值队列头位置等于队列头位置加1(front=front+1),若队列头位 置大于等于重更新缓存阈值(front〉=REN
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1