一种定长单字节格式报文协议下串口接收预处理方法与流程

文档序号:13010407阅读:550来源:国知局

本发明涉及串口接收技术领域,尤其涉及一种定长单字节格式报文协议下串口接收预处理方法。



背景技术:

在产品设计中,串口数据通信是普遍采用的一种信息交互方式。然而在其通信过程中,对于接收数据不以设计者理想的整包接收的情况,经常会出现有效数据丢失的现象;对于多于一包数据接收的情况,会出现舍弃一包外多余部分数据的现象。对于高可靠性要求的产品和系统来说,每包数据都是至关重要的,丢失数据这是不能容忍的故障。而目前,在应用层设计中,并没有完整、规范、通用可移植的方法。



技术实现要素:

鉴于上述的分析,本发明旨在提供一种定长单字节格式报文协议下串口接收预处理方法,可以实现串口数据接收后对接收的数据与协议报文格式进行比对和预处理,防止出现有效数据丢失的现象。

本发明的目的主要是通过以下技术方案实现的:

一种定长单字节格式报文协议下串口接收预处理方法的具体实现步骤如下:

步骤一、接收串口数据;

步骤二、检查在本次接收数据之前,是否存在不足一包协议字节数的剩余数据,若存在,则将所述剩余数据与本次接收到的数据进行合并组成一个数据包;若无,则本次接收到数据作为一个单独的数据包;

步骤三、按照协议约束对所述数据包进行判别处理,当符合协议约束时,则进入下一步处理;当不符合协议约束时,则返回步骤一;

步骤四、判别字节头是否符合要求,若不满足,则将首字节移除,返回步骤三;若满足,则进行下一步处理;

步骤五、判别字节尾是否符合要求,若不满足,则将首字节移除,返回步骤三;若满足,则进行下一步处理;

步骤六、判别校验和是否符合要求,若不满足,则将首字节移除,返回步骤三;若满足,则将所述报文协议规定的字节长度的数据发送用于后续处理,发送完成后,移除上述报文协议规定的字节长度的数据,返回步骤三。

进一步地,步骤五中根据报文协议规定的字节长度在数据包中确定字节尾。

进一步地,步骤一中串口接收数据的工作方式为阻塞形式。

进一步地,通过剩余字节个数变量来判断是否存在不足一包协议字节数的数据,所述剩余字节个数变量初始化为0,若在一次接收处理后仍有剩余字节数,该变量值被刷新为该次剩余字节数的个数。

进一步地,步骤二中所述数据的合并方式是按照发送方的字节数据顺序组包。

进一步地,步骤三中所述协议约束为定长报文约定的数据长度。

进一步地,所述数据移位是以存放数据的缓存数组的下标为索引进行数据移位。

进一步地,所述校验和为报文校验字,为报文内容n个字节内容的总和。

进一步地,所述步骤四至六均通过缓存数组移位的方式将首字节移除。

本发明有益效果如下:

本发明针对单字节头、单字节校验、单字节尾的定长串口数据通信,设计了一种串口数据接收预处理架构,作用于底层串口数据阻塞接收之后,应用层根据协议处理之前,对于符合协议约束的数据,送入报文解析函数接口,对于不符合协议约束的数据,进行逐字节的剔除。若存在剩余不足一帧报文的数据,仍可将其与下一组数据,进行组包后,再次逐字节判别处理,有效的使用了每个串口数据,使得串口数据接收使用率达到了100%,避免了误丢包现象的发生,显著提高了产品和系统的可靠性,间接减少了产品和系统维护等人力物力成本,创造了一定的经济效益。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为数据处理规则流程图

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理。

本实施例中的定长单字节格式报文协议是指在两个设备信息交互的软件协议中,规定其每次通信的信息长度为一定长,其内容格式依次为报文头、报文内容、报文校验字、报文尾;所述报文头为1个字节,所述报文内容包括n个字节,所述报文校验字为1个字节,所述字节报文尾为1个字节。

如图1所示,一种定长单字节格式报文协议下串口接收预处理方法的具体实现步骤如下:

步骤一、接收串口数据。

优选地,本实施例中串口接收数据的工作方式为阻塞形式,但本方法对于串口接收工作方式的设定并不唯一,也适用于其他的串口接收形式。

步骤二、检查在本次接收到数据之前,是否存在上次数据处理剩余的不足一包协议字节数的数据,若有,则将所述剩余数据与本次接收到的数据进行合并组成一个数据包;若无,则本次接收到数据作为一个单独的数据包;

通过剩余字节个数变量判断,在接收本次数据之前,是否有上次数据处理剩余的数据,所述剩余字节个数变量为定义的变量,初始化为0,若在一次接收处理后仍有剩余字节数,该变量值被刷新为该次剩余字节数的个数;如果所述剩余字节个数变量为0,说明上次数据处理无剩余数据,正常进行本次数据接收;如果所述剩余字节个数变量不为0但小于定长报文约定的个数,说明上次接收的数据个数不为定长报文约定的个数或者其整数倍,在本次接收前,存在上次数据处理剩余的数据,则按照发送方的字节数据顺序组包,上次处理剩余的数据放在缓存数组中,与本次接收的数据合并,形成组包;若不存在上次数据处理剩余的数据,正常进行本次数据接收,将接收到数据作为一个单独的数据包。

步骤三、按照协议约束对所述数据包进行判别处理,当符合协议约束时,则进入下一步处理;当不符合协议约束时,则返回步骤一。

所述协议约束为定长报文约定的数据长度,按照所述协议约束对步所述数据包进行判断,若所述数据包的数据长度小于定长报文约定的长度,则认为是不足一包协议字节数的数据,更新剩余字节个数变量,返回步骤一,等待下次数据接收;若所述数据包的数据长度不小于定长报文约定的长度,则进入下一步处理。

步骤四、判别字节头是否符合要求,若不满足,则通过缓存数组移位,将首字节移除,重复步骤三至步骤四判别;若满足,则进行下一步处理;

将步骤三中的数据长度大于等于定长报文约定的长度的数据包存放在缓存数组中,判别所述数据的字节头是否符合所述定长单字节格式报文协议规定的字节头格式,如果符合则进行下一步处理;如果不符合,则根据所述存放数据的缓存数组的下标索引进行数据移位,将所述数据包的首字节移除,第二个数据放在首字节的位置上,即把首字节数据覆盖刷新,第三个数据放在原第二个位置上,依次将所有数据前移,形成新的数据包;之后将所述新数据包进行步骤三的所述协议约束判别处理和步骤四的字节头判别,直至找到正确的字节头,并且判断所剩组包数据的长度依然大于所述协议约束;判别正确的字节头后,进入下一步判别字结尾。

步骤五、判别字节尾是否符合要求,若不满足,则通过缓存数组移位,将首字节移除,重复步骤三至步骤五判别;若满足,则进行下一步处理

由于步骤四存放在数组中数据包的长度大于等于所述协议约束,则按照报文协议规定的字节长度在数据包中确定数据的字节尾,即从确定的字节头开始数,所述协议约束规定字节数减1个字节即为字节尾;软件判断所述数据的字节尾是否符合所述定长单字节格式报文协议规定的字节尾格式,如果符合则进行下一步处理;若不符合所述协议规定的字节尾格式,则根据所述存放数据的数组的下标索引进行数据移位,将所述数据包的首字节移除,第二个数据放在首字节的位置上,即把首字节数据覆盖刷新,第三个数据放在原第二个位置上,依次将所有数据前移,形成新的数据包;之后将所述新数据包,进行步骤三的协议约束判别处理、步骤四的字节头判别和步骤五的字节尾判别,直至找到正确的字节尾,判别正确的字节尾后,进入下一步判别校验和。

步骤六、判别校验和是否符合要求,若不满足,则通过缓存数组移位,将首字节移除,重复步骤三至步骤六判别;若满足,则将所述报文协议规定的字节长度的数据送入接口处理函数进行处理。

校验和为报文校验字,为报文内容n个字节内容的总和。

对于判别出正确的字节头、字节尾的数据包,按照报文协议的规定进行校验和的判别,若所述校验和与报文协议的规定的校验和一致,则说明数据包中按照报文协议规定长度的数据符合报文协议的要求,可以正常接收;正常接收后如有剩余数据,则更新剩余字节个数变量,等待下一次数据接收;若所述校验和与报文协议的规定的校验和不一致,由于已经检验过的字节头、字节尾没有出错,则说明报文内容部分出现了错误,即报文头和报文检验和之间的报文内容数据有误;对此数据包重复步骤三至步骤六进行处理判别;直至数据字节头、字节尾、校验和以及字节长度都满足所述报文协议的规定,则将从数据送入接口处理函数进行处理。

以下为通过本发明中的方法对通信过程中常见故障的处理举例。

假设通信协议约束为:报文长度为6个字节,依次为报文头占1个字节、报文内容占3个字节、报文校验和占1个字节、报文尾占1个字节;定义报文头为0x7e,报文校验和为报文内容3个字节相加的结果,报文尾为0x7f。

故障例一、不满足报文长度处理情况

首次接收到数据7ea10000a1。报文长度正常为6个字节,而本次接收为5个字节,不满足协议约束,通常情况,被用户舍弃。通过本发明所述串口接收预处理方法,通过本发明所述串口接收预处理方法,这5个字节接收后,由于不满足6个数据的长度,被保存在剩余数据数组中,以供下次接收到新的数据后,进行组包后再处理,避免了直接舍弃。

故障例二、满足报文长度,却不符合约束条件的情况

首次接收到数据7f7ea10000a17f。报文长度正常为6个字节,而本次接收为7个字节,如果用户按照通常方法进行判别,发现首字节为0x7f,而非约定的0x7e,那么此次接收到的前6个数据也极容易被用户舍弃,实际上后6个数据正是满足用户协议约束的正确报文。通过本发明所述串口接收预处理方法,在判断报文长度大于正常报文的约束长度后,判断数据首字节0x7f不是约定的首字节0x7e,将该数据通过缓存数组移位将首字节0x7f移除,重新得到的数据包为7ea10000a17f,其首字节为0x7e,通过判断此首字节为约定的首字节,则认为首字节正确,再判别报文尾为约定的尾字节0x7f,判别结果正确,再判别检验和,校验和位置上的数据为a1,按约定计算方法计算a1+00+00=a1,两者一致,判别检验和正确,最后证明这包数据7ea10000a17f为用户需要的数据,将其整包送至用户接口,供用户使用。

故障例三、一组报文,分两次接收到,被当做两组不满足长度的报文

分两次接收到分别接收到7ea10000a1和7f。两次接收数据如实施例一,均不满足协议约束,但实际上7ea10000a17f正是符合用户要求的报文,因此,被舍弃是不合适的。通过本发明所述串口接收预处理方法,首先接收到7ea10000a1,由于这是5个数据,不满足定长6个数据的要求,故将其暂存在剩余数据数组中。当再次接收到1个数据7f后,本方法将该数据组加到上次处理剩余数据7ea10000a1之后,形成数据包7ea10000a17f。此时该数据包为6个数据,满足长度处理条件,其首字节为0x7e,通过判断此首字节为约定的首字节,则认为首字节正确,再判别报文尾为约定的尾字节0x7f,判别结果正确,再判别检验和,校验和位置上的数据为a1,按约定计算方法计算a1+00+00=a1,两者一致,判别检验和正确,最后证明这包数据7ea10000a17f为用户需要的数据,将其整包送至用户接口,供用户使用。

本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1