一种串口GPS报文数据的接收及解析方法、系统与流程

文档序号:28318610发布日期:2022-01-04 21:02阅读:1600来源:国知局
一种串口GPS报文数据的接收及解析方法、系统与流程
一种串口gps报文数据的接收及解析方法、系统
技术领域
1.本发明涉及一种串口gps报文数据的接收及解析方法、系统,属于农业机械辅助驾驶技术领域。


背景技术:

2.字节数组是一种数据类型,可用于存取字符型数据。具有辅助驾驶功能的作业机械一般采用gps定位,其gps定位报文数据又采用串口传输方式,但在通讯量大时,经常会出现收不到完整的数据帧,或是在解析时出现丢失有效数据字节的情况。
3.专利cn111858447a公开了一种从串口接收数据、处理数据帧的方法,包括以下步骤s1:串口初始化,创建串口接收任务、串口读取任务;s2:从串口接收数据后,执行串口中断,串口中断处理时,接收端将串口接收的数据放在消息节点中,并将消息节点的数据发送到接收消息队列中;s3:执行串口接收任务,即不断从接收消息队列中获取消息节点的数据,然后从消息节点中获取到串口接收的数据,并将其添加到环形队列中;s4:执行串口读取任务,即从环形队列中读取串口接收到的数据;并对从环形队列中读取的数据进行组帧。
4.专利cn111858447a采用的方法,将收到的串口数据发送至消息队列,降低了中断处理耗时,同时也将串口接收数据与数据处理分开,不会造成串口溢出而丢失数据的情况。但是其一,接收串口数据采用消息队列和环形队列的方法导致程序处理上较为复杂。其二,在发送端频发发送数据,或数据量较多的情况下,接收端只是尽可能多的接收到有效数据,降低丢失数据的机率,并不保证数据的完全接收。
5.专利cn107395565b公开了一种定长单字节格式报文协议下串口接收预处理方法,该方法对单字节头、单字节校验、单字节尾的定长串口数据通信,设计了一种串口数据预处理架构,作用于底层串口数据接收之后,应用层根据协议处理之前,对于符合协议约束的数据,送入报文解析函数接口,对于不符合协议约束的数据,进行逐字节的剔除。若存在剩余不足一帧报文的数据,仍可将其与下一组数据,进行组包后,再次逐字节判别处理。
6.专利cn107395565b公开了一种定长单字节格式报文协议下串口接收预处理方法,该方法对单字节头、单字节校验、单字节尾的定长串口数据通信,其一,只适用固定长度的数据解析;其二,采用单字节判别处理方式,程序效率不是最优。


技术实现要素:

7.本发明所要解决的技术问题是克服现有技术的缺陷,提供一种串口gps报文数据的接收及解析方法,在接收串口数据时,采用追加本地字节数组的方式,保证串口报文的完全接收;对本地字节数组从起始地址开始按有效报文长度拆分、剔除得到的含有完整报文尾的gps报文,避免误丢包现象的发生。
8.为达到上述目的,第一方面,本发明提供一种串口gps报文数据的接收及解析方法,包括:判断串口回调函数是否接收到串口发出的串口数据到来信号;
若串口回调函数接收到串口发出的串口数据到来信号,则读取串口数据并追加到本地字节数组,从本地字节数组中解析报文,更新本地字节数组。
9.优先地,若串口回调函数没有接收到串口发出的串口数据到来信号,串口回调函数持续等待;若串口接收到数据,串口立即发送串口数据到来信号给串口回调函数,串口回调函数接收到串口发出的串口数据到来信号。
10.优先地,读取串口数据并追加到本地字节数组,包括:串口回调函数读取串口数据a,将串口数据a追加到本地字节数组b;串口数据a为单个字节、一整串报文或多条报文。
11.优先地,从本地字节数组中解析报文,更新本地字节数组,包括:s51:一次性读取全部本地字节数组b的数据;s52:判断本地字节数组b中是否包含报文尾部标识,若本地字节数组b中包含若干个报文尾部标识,则进入步骤s53;s53:以报文尾部标识为拆分符,将本地字节数组b拆分得到n个gps报文ci;定义循环量i为常数,i≤n;s54:循环解析gps报文ci,判断i是否小于n,若i小于n,则进入步骤s55;s55:从本地字节数组b中删除第i条gps报文ci;s56:判断gps报文ci是否包含报文头标志符, gps报文ci包含报文头标志符,则进入步骤s57;s57:进行数据校验,若校验成功则进入步骤s58;s58:按协议分割符将gps报文ci分割为字符串列表dm,dm包含第i个gps报文ci的有效数据;s59:根据不同字符串列表dm的第0位第i个gps报文ci的类型,得到不同长度类型的gps数据。
12.优先地,s52中,判断本地字节数组b中是否包含报文尾部标识,若本地字节数组b中不包含报文尾部标识则返回“判断串口回调函数是否接收到串口发出的串口数据到来信号”步骤;s54中,循环解析gps报文ci,判断i是否小于n,若i不小于n,则返回“判断串口回调函数是否接收到串口发出的串口数据到来信号”步骤;s56中,判断gps报文ci是否包含报文头标志符,若gps报文ci不包含报文头标志符,则i数值加1并返回到步骤s54;s57中,进行数据校验,若校验失败则i数值加1并返回步骤s54。
13.优先地,在判断串口回调函数是否接收到串口发出的串口数据到来信号之前,初始化串口,注册串口回调函数。
14.优先地,初始化串口,包括:自动查找可用串口名称,初始化串口名称、波特率、校验位和停止位,初始化本地字节数组。
15.优先地,注册串口回调函数,包括:定义串口回调函数,将串口数据到来信号与串口回调函数关联。
16.优先地,步骤s57中,进行数据校验,包括:
数据校验采用按位异与的方式,对gps报文ci进行计算得出计算校验码,读取gps报文ci中的校验部分得到报文校验码;判断计算校验码与报文校验码是否相等,若计算校验码与报文校验码相等,则校验成功,若计算校验码与报文校验码不相等则校验失败。
17.优先地,s55中,从起始地址开始按有效报文长度剔除拆分得到的含有完整报文尾的gps报文,更新本地字节数组。
18.第二方面,本发明提供一种串口gps报文数据的接收及解析系统,包括处理器和存储设备,所述存储设备中存储有多条指令,用于所述处理器加载并执行第一方面所述方法的步骤。
19.本发明所达到的有益效果:本发明提供一种串口gps报文数据的接收及解析方法,其一,在接收串口数据时,采用追加本地字节数组的方式存储报文,不丢弃任何一个字符,保证串口报文的完全接收;其二,对本地字节数组从起始地址开始按有效报文长度剔除拆分得到的含有报文尾部标识的完整gps报文,避免误丢包现象的发生,其三,实时更新本地字节数组,防止了其溢出导致的程序崩溃;其四,对报文按协议格式长度,而非单字节的方式处理,提高了程序处理效率,适用长度不同的报文。
20.本发明中本地字节数组的剔除更新,是按照剔除的报文头部标识至报文尾部标识之间的长度,而非固定的长度,所以适合不同长度报文更新。更新后的字节数组还保留有部分报文,待串口数据信号到来时,可继续追加,直到收到新的报文尾部标识,进行下次更新。本发明采用剔除有效报文、保留剩余不完整报文等待再追加的方式,避免了丢包现象的发生。
21.本发明中若本地字节数组同时含有多个完整的有效gps报文,则会在一次串口信号到来是循环处理完毕,提高了重新处理效率。
附图说明
22.图1 为本发明中串口初始化流程图;图2 为本发明的原理框图;图3 为本发明中报文分割流程图;图4 为本发明中报文解析流程图。
具体实施方式
23.以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
24.实施例一:如图1~图4所示,本实施例提供一种串口gps报文数据的接收及解析方法,包括步骤如下:s1: 初始化串口;s2: 注册串口回调函数;s3: 判断串口回调函数是否接收到串口发出的串口数据到来信号;
s4: 若串口回调函数接收到串口发出的串口数据到来信号,读取串口数据并追加到本地字节数组;s5: 从本地字节数组中解析报文;s6: 更新本地字节数组。
25.进一步地,所述步骤s1中,初始化串口包括:自动查找可用的串口名称,初始化串口名称、波特率、校验位和停止位为默认值,初始化本地字节数组归零。
26.进一步地,所述步骤s2中,注册串口回调函数包括:定义串口回调函数,将串口数据到来信号与串口回调函数关联。优选的将串口数据到来信号readyread与串口回调函数slotrecievportdata关联。
27.进一步地,所述步骤s3中,一旦串口接收到数据,立即发送串口数据到来信号给串口回调函数。
28.进一步地,所述步骤s4中,若没有接收到串口数据到来信号,串口回调函数处理程序持续等待,一旦串口回调函数接收到串口数据到来信号时立即调用串口回调函数,读取串口数据a,优选的使用readall函数读取串口中的全部数据,无论是单个字节,还是一整串报文,或是多条报文,均将其追加到本地字节数组b。由于从串口读到的串口数据a,可能是单个字节、多个字节或非完整的gps报文,所以将读到的串口数据a以追加的方式先组成串,保证了不丢失任何一个字节。采用追加的方式存储报文,保证了报文的完全接收。
29.示例1,当gps定位模块向接收串口发送以下类型、长度不一的报文时:$gnvtg,353.763,t,360.233,m,0.02335,n,0.04324,k,a*3b$gprmc,144326.00,a,5107.0017737,n,11402.3291611,w,0.080,323.3,210307,0.0,e,a*20。
30.串口接收到的报文如下,即包含单个字符也包含多个字符gpsserialport::slotrecievportdata()181:recievport:"pts/19""$"gpsserialport::slotrecievportdata()181:recievport:"pts/19""g"gpsserialport::slotrecievportdata()181:recievport:"pts/19""n"gpsserialport::slotrecievportdata()181:recievport:"pts/19""h"gpsserialport::slotrecievportdata()181:recievport:"pts/19""d"gpsserialport::slotrecievportdata()181:recievport:"pts/19""t"gpsserialport::slotrecievportdata()181:recievport:"pts/19"","gpsserialport::slotrecievportdata()181:recievport:"pts/19""178"gpsserialport::slotrecievportdata()181:recievport:"pts/19""."gpsserialport::slotrecievportdata()181:recievport:"pts/19""7236"gpsserialport::slotrecievportdata()181:recievport:"pts/19"","gpsserialport::slotrecievportdata()181:recievport:"pts/19""t"gpsserialport::slotrecievportdata()181:recievport:"pts/19""*"gpsserialport::slotrecievportdata()181:recievport:"pts/19""1"gpsserialport::slotrecievportdata()181:recievport:"pts/19""5"gpsserialport::slotrecievportdata()181:recievport:"pts/19""\r\n$gprmc,14432"

串口回调函数对收到的字符进行追加,得到的字节数组为:"$gnhdt,178.7236,t*15\r\n$gprmc,14432",此时串口收到了一包完整的gnhdt格式的gps报文和部分非完整的gprmc格式的gps报文。
31.结合图3,所述步骤s5中,从本地字节数组b中解析报文,包括,s51:一次性全部读取本地字节数组b的数据。
32.s52:判断本地字节数组b中是否包含报文尾部标识,对符合nema协议的gps报文来说,报文尾部标识为换行符;若本地字节数组b中不包含任何报文尾部标识,则返回到串口回调函数判断是否接收到串口发出的串口数据到来信号,因为此时本地字节数组b的数据不包含完整的有效报文。若本地字节数组b包含报文尾部标识,如示例1,串口回调函数判断字节数组中包括一个标识符"\n",说明本地字节数组b包含完整的gps报文,则进入s53。
33.s53:以报文尾部标识为拆分符,拆分字节数组b为n组gps报文cn。本地字节数组b中可能包含n个报文尾,n大于等于1。对本地字节数组b拆分后,得到n个gps报文ci。如示例1,串口回调函数判断字节数组中包括n(n=1)一个gps报文ci。定义循环量i为常数,i≤n。
34.s54:循环解析gps报文ci,定义循环量i, 判断i是否小于n,如i不小于n,则说明解析完毕,则返回到串口回调函数判断是否接收到串口发出的串口数据到来信号;否则,进入报文解析循环,到步骤s55。
35.s55:由于其一:本地字节数组b采用的是追加的方式获取串口数据;其二,gps报文ci是按报文尾方式拆分得到的,故取出gps报文ci后,即可从本地字节数组b中删除第i条gps报文ci,实现更新本地字节数组b,其三,循环处理拆分直到得到的完整报文。对gps报文ci进行计算得出计算校验码,这一计算步骤属于现有技术,本实施例不再详细阐述过程。
36.优选的,本地字节数组b从起始地址开始按协议格式长度,而非单字节的方式处理,剔除拆分得到的含有完整报文尾的gps报文ci,在避免误丢包现象的发生的同时提高了程序处理效率;在解析过程实时更新,防止了其溢出导致的程序崩溃。
37.如示例1,串口回调函数取出有效gps报文为:"$gnhdt,178.7236,t*15\r\n"。取出有效报文后的字节数组更新为:"$gprmc,14432"。
38.优选的,剔除gps报文,更新后的字节数组长度变短,不会溢出。
39.优选的,字节数组的剔除更新,是按照剔除的报文标识头至报文标识尾之间的长度,而非固定的长度,所以适合不同长度报文更新。
40.优选的,更新后的字节数组还保留有部分报文,待串口数据信号到来时,可继续追加,直到收到新的报文尾,进行下次更新。采用剔除有效报文,保留剩余不完整报文等待再追加的方式,避免了丢包现象的发生。
41.优选的,若本地字节数组同时含有多个完整的有效gps报文,则会在一次串口信号到来是循环处理完毕,提高了重新处理效率。
42.s56:判断gps报文ci是否包含报文头标志符。符合nema协议的gps报文头标志符一般为“$”,若gps报文ci不包含,则i数值加1并返回到步骤s54。若包含,如示例1,串口回调函数取出有效gps报文为:"$gnhdt,178.7236,t*15\r\n",包含有报文头标识符,则进入步骤s57。
43.优选的,只要取出的gps报文ci包含有报文头标识符合报文尾标识符,就可以进行
报文解析,而与报文长度无关,所以使用类型、长度不同的报文。
44.s57:进行数据校验,若校验失败,则i数值加1并返回步骤s54,若校验成功,则进入步骤s58。
45.优选的,数据校验采用按位异与的方式,对gps报文ci的数据进行计算得出计算校验码,读取gps报文ci中的校验部分得到报文校验码,然后比较计算校验码与报文校验码是否相等,若相等,则校验成功;若不相等则校验失败。
46.s58:按协议分割符分割gps报文ci为dm。dm为字符串列表,包含第i组gps报文ci的有效数据。分割符一般为“,”。
47.s59:根据dm0类型解析报文。根据不同的字符串列表dm的第0位第i组gps报文的类型gpgga、gnhdt、gnvtg和gprmc,得到对应的不同长度类型的gps数据。
48.结合图4,报文解析流程,本实施例使用的gps报文的类型为gpgga,gnhdt,gnvtg,gprmc。根据字符串列表dm第0位的值,如果是gpgga,则按gpgga协议解析gpgga数据,如果是gnhdt,则按gnhdt协议解析gnhdt数据,如果是gnvtg,则按gnvtg协议解析gnvtg数据,如果是gprmc,则按gprmc协议解析gprmc数据。
49.实施例二:基于实施例一所述的一种串口gps报文数据的接收及解析方法,本实施例提供一种串口gps报文数据的接收及解析系统,包括处理器和存储设备,所述存储设备中存储有多条指令,用于所述处理器加载并执行实施例一所述串口gps报文数据的接收及解析方法的步骤。
50.本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd

rom、光学存储器等)上实施的计算机程序产品的形式。
51.本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
52.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
53.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1