加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

NMEA library数据处理过程分析

发布时间:2020-12-25 01:31:12 所属栏目:大数据 来源:网络整理
导读:? ?今天学习一个GPS数据解析开源库——NMEA lib。使用这个库,可以轻松处理GPS接收机发出的数据,并不需要了解NMEA的具体协议,这个库可以解析所有NMEA0813规定的所有报文格式。不仅可以解析出原始数据中包含的所有参数,还可以计算两点之间的距离、方向以

? ?今天学习一个GPS数据解析开源库——NMEA lib。使用这个库,可以轻松处理GPS接收机发出的数据,并不需要了解NMEA的具体协议,这个库可以解析所有NMEA0813规定的所有报文格式。不仅可以解析出原始数据中包含的所有参数,还可以计算两点之间的距离、方向以及一些额外的统计信息,计算非常高效。

? ?这个协议栈完全是由C语言编写,集成到嵌入式系统中非常容易。这里主要研究下协议栈的数据处理过程以及软件架构。

? ?在https://sourceforge.net/projects/nmea/?source=typ_redirect可以下载到源代码,这里就以nmealib-0.5.3为例进行分析。这个lib可以解析的报文格式有GPGGA 、GPGSA 、GPGSV 、GPRMC 以及GPVTG。软件包提供了几个例子,包括如何解析这几个报文参数,如何通过参数生成报文,如何计算一个点移动的距离以及方向等。这里只关心如何从原始输出报文中解析各个有用的参数。

? ?nmealib-0.5.3 Lib使用nmeaINFO 这个结构体存储包括经度、纬度、高度、速度、卫星个数、UTC时间,各个方向的定位精度等信息。nmea_parse是一个主要的解析器,将这个计算器中包含nmea_parser_push以及nmea_parser_pop两个部分。

? ?nmea_parser_push的任务是在buf中把每条sentence都逐一找出来,判断帧格式,然后调用相应的解析函数解析出具体数值并进行存储。

? ?以一条标准的GPS报文来看:

? ?"$GPRMC,173843,A,3349.896,N,11808.521,W,000.0,360.0,230108,013.4,E*69rn"

? ?以"*69rn"结束,其中*为固定格式,69为CRC校验位,通过这个*就可以把这条sentence从buf中取出。然后,通过nmea_pack_type查找帧头,也就是$后的帧头来调用相应解析函数,比如上面这条语句会调用nmea_parse_GPRMC,来解析。nmea_parser_push中使用了一个nmeaParserNODE的节点来存储各个sentence的类型,以及解析出来的各个参数,每解析一个节点就把这个节点插入到链表nmeaPARSER *parser中去,直到解析完成。

? ?接下来的工作就交给nmea_parser_pop了,遍历整个链表,从parser中把头节点parser->top_node依次取出nmeaParserNODE,根据node->packType把各个node->pack解析好的数据取出,对nmeaINFO这个结构体依次进行填充。

? ?解析完成后再把各个节点分配的内存进行释放,删除这个链表。

? ?最后再总结下这个过程,首先把接收到的数据放到缓冲区,在缓冲区中依次找出各条sentence进行解析,把解析出来的数据插入链表,把链表中的数据取出后依次填充info结构体,释放缓冲区以及链表。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!