NMEA library数据处理过程分析

   今天学习一个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*69\r\n"

   "*69\r\n"结束,其中*为固定格式,69CRC校验位,通过这个*就可以把这条sentencebuf中取出。然后,通过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结构体,释放缓冲区以及链表。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值