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

文档序号:9304518阅读:来源:国知局
EW_LEVEL),则执行步骤4.0.5;
[0056]若队列头位置小于重更新缓存阈值(front<RENEW_LEVEL),执行步骤2;
[0057] 步骤4.0.5、复制队列尾位置减同步字长度加1 (rear-(PACK_SYNC_LEN-l))位置 同步字长度减1(PACK_SYNC_LEN- 1)个数据到缓存首(buffer)位置,赋值队列头位置等 于缓存首位置(front=buffer),队列尾位置等于队列头位置加同步字长度减1(rear= front+PACK_SYNC_LEN- 1),执行步骤 2 ;
[0058] 步骤4. 1. 1、如图4所示,若当前接收数据的长度大于等于同步字长度加2(reCV_ length〉=PACK_SYNC_LEN+2),则执行步骤4. 1. 2 ;
[0059]若当前接收数据的长度小于同步字长度加2 (reCV_length<PACK_SYNC_LEN+2), 则执行步骤2;
[0060]步骤4. 1. 2、若数据包位置(package)长度位校验成功,赋值解包进度等于 2(state= 2),然后执行步骤2,
[0061] 若数据包位置(package)长度位校验不成功,赋值解包进度等于0 (state = 0),队 列头位置等于队列头位置加1 (front = front+l),然后执行步骤2 ;
[0062] 步骤4. 2. 1、如图5所示,若当前接收数据的长度大于等于同步字长度加数据包位 置的第一个数据(recv_length> =PACK_SYNC_LEN+package[0]),贝执行步骤 4. 2. 2;
[0063] 若当前接收数据的长度小于同步字长度加数据包位置的第一个数据(reCV_ length<PACK_SYNC_LEN+package[0]),则执行步骤2 ;
[0064] 步骤4. 2. 2、若数据包位置(package)数据包校验成功,执行步骤4. 2. 3;
[0065] 若数据包位置(package)数据包校验不成功,执行步骤4. 2. 4;
[0066] 步骤4. 2. 3、复制数据包位置(package)处数据包位置的第一个数据 (package[0])数目的数据到交换缓存区,设置数据包接收标志,赋值解包进度等于 0 (state= 0),队列头位置等于缓存首位置(front=buffer),队列尾位置等于缓存首位置 (rear=buffer),执行步骤 5;
[0067]步骤4. 2. 4、赋值解包进度等于0 (state=0),队列头位置等于队列头位置加 1 (front=front+1),执行步骤 2 ;
[0068] 步骤5、退出程序。
[0069] 其中,数据包格式定义如下:
[0070]
[0071]PACK_SYNC为同步字,长度为PACK_SYNC_LEN个数据;
[0072]LENGTH为数据包长度,长度为1个数据,表明从LENGTH位开始,到PACK_CHK位的 数据个数;
[0073]LEN_CHK为数据包长度位校验,长度为1个数据,步骤4. 1. 2中package长度位校 验即是根据这一位判断数据是否正确,具体判断方式根据双方通信的协议进行定义;
[0074]DATA为传输的数据,长度为任意位;
[0075]PACK_CHK为数据包校验位,长度为1个数据,是步骤4. 2. 2中package数据包校验 即是根据这一位判断数据是否正确,具体判断方式根据双方通信的协议进行定义。
[0076] 接收队列为通信外设与主控程序之间的数据通道,每当外设接收到数据时,便将 数据存入接收队列,主控程序可从接收队列中读取外设接收的数据;
[0077]buffer为类型为指针,指向缓存区,缓存区大小一般可为最长数据包长度的两 倍;
[0078]state为表明当前解包进度,可能取值为0, 1,2;
[0079]front为类型为指针,指向队列头;
[0080] rear为类型为指针,指向队列尾;
[0081]sync为类型为指针,当接收到同步字后指向同步字位置;
[0082] package为类型为指针,当接收到同步字后,指向数据包欲存储的位置;
[0083] PACK_SYNC为常量字符串,表示同步字,可以是任意内容;
[0084]PACK_SYNC_LEN为常量,表示同步字长度;
[0085]RENEW_LEVEL为常量指针,表示缓存重新刷新的阈值,一般可为buffer加上最长 数据包长度。
[0086]NULL为空值常量,在实际应用中可取值为零;
[0087] *pointer为一种操作,对指针所指向的地址进行操作,pointer可为任一指针变 量;
[0088]pointer[n]为一种操作,对指针加n所指向的地址进行操作,pointer可为任一指 针变量;
[0089]recv_length为临时变量,表明当前已接收的有效数据长度,其值等于 (rear-front);
[0090]pos为临时变量,类型为指针,当搜索到同步字后,指向同步字首位置。
[0091] *为对指针指向的数据进行操作,这是C语言的一种表示,本文的代码可以理解为 非常接近于C语言的伪代码;
[0092]rear- (PACK_SYNC_LEN-1)为先计算PACK_SYNC_LEN减 1,再用rear减去该结果;
[0093] package [0]表示对指针+数字所指向的数据进行操作;package指向除前导后的 数据包首位置,根据数据包格式的定义,该位置也就是数据包长度,即LENGTH。
[0094] 采用以下实施例验证本发明的有益效果:
[0095] 实施例1
[0096] -种基于数据流传输的数据包提取方法具体是按照以下步骤进行的:
[0097] 步骤1、如图1所示,初始化各变量,执行解包进度等于0(state= 0),队列头位置 等于缓存首(front=buffer),队列尾位置等于缓存首(rear=buffer),同步字位置等于 空值(sync=NULL),数据包位置等于空值(package=NULL),各变量为解包进度(state)、 队列头位置(front)、缓存首位置(buffer)、队列尾位置(rear)、同步字位置(sync)、(空 值)NULL和数据包位置(package);
[0098] 步骤2、若接收队列中存在数据,则读取数据接收的数据(c),赋值队列尾位置的 数据等于接收的数据(*rear=c),队列尾位置等于队列尾位置+1(rear=rear+1),当前 接收数据的长度等于队列尾位置-队列头位置(recv_length=rear-front),执行步骤3 ;
[0099] 若接收队列中不存在数据,则执行步骤5;
[0100] 步骤3、如图2所示,判断解包进度(state)值,若解包进度等于0(state= 0),执 行步骤4. 0. 1 ;
[0101] 若解包进度等于1(state= 1),执行步骤4. 1. 1 ;
[0102] 若解包进度等于2(state= 2),执行步骤4. 2. 1 ;
[0103] 步骤4.0. 1、如图3所示,若当前接收数据的长度大于等于同步字长度(reCV_length〉=PACK_SYNC_LEN),则执行步骤4.0? 2,
[0104] 若当前接收数据的长度小于同步字长度(recv_length<PACK_SYNC_LEN),则执 行步骤2 ;
[0105] 步骤4.0.2、在队列头位置(front)到队列尾位置(rear)之间寻找同步字(PACK_ SYNC),若寻找到,设寻找到的位置为寻找到的同步字位置(pos),执行步骤4.0.3 ;
[0106] 若没寻找到,执行步骤4.0.4;
[0107] 步骤4. 0. 3、赋值解包进度等于1(state= 1),同步字位置等于寻找到的同步字位 置(sync=pos),数据包位置等于同步字位置加同步字长度(package=sync+PACK_SYNC_ LEN),执行步骤2 ;
[0108] 步骤4.0.4、赋值队列头位置等于队列头位置加1(front=front+1),若队列头位 置大于等于重更新缓存阈值(fro
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1