8831浏览
查看: 8831|回复: 2

[进阶] GPS模块数据的解析

[复制链接]
GPS模块一般使用NMEA-0183协议。改协议在前面的文章中有提到过一部分。
http://mp.weixin.qq.com/s?__biz=MzA4MjU0MTU0NQ==&mid=404346824&idx=2&sn=a406285528453724005e9b84779cd6af#rd

可以看到,其中最重要的字段应该为$GPGGA字段,该字段的数据几乎包含了GPS所需要所有数据,这里再贴一遍他的含义。

例:
$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F

字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息

字段1:UTC 时间,hhmmss.sss,时分秒格式

字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段3:纬度N(北纬)或S(南纬)

字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段5:经度E(东经)或W(西经)

字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算

字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

字段8:HDOP水平精度因子(0.5 - 99.9)

字段9:海拔高度(-9999.9 - 99999.9)

字段10:地球椭球面相对大地水准面的高度

字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)

字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

字段13:校验值

所以要解析GPS数据,首要任务就是解析$GPGGA的数据。
观察GPGGA的数据,发现他大概有3个部分组成。

头:$GPGGA。
数据:经纬度,海拔,时间,卫星数量等等。
尾:校验和。

头的作用是用来定位数据,因为GPS模块可能会除了这个字段的数据以外,还会发其他字段的数据。那么根据头,我们首先在读取串口的时候检测是否是这个头,然后再按照这个头后的数据格式读取正确数量的数据。

尾是用来检验数据,校验和的存在就是为了验证收到的数据的正确性。查询该协议可知,此处的校验使用的是异或校验。即把收到的所有数据(除了$和*以外)进行异或(可百度)操作。最终的到的答案与*号后的数据比较。相同则校验通过说明数据读取正确没有误码。

有了头、尾,数据已经可以被定位,现在来看看各个数据如何解析。可以看出各个数据之间都是由逗号‘,’隔开,如此一来可以用逗号作为分隔符,分开各个数据,然后再分别提取其中的有用数据。

现在应该都明白了吧。
不懂也没关系,DF为大家提供了完整可用的GPS数据解析库,lisper大神编写。下载地址为:
https://github.com/DFRobot/DFRobot_utility
怎么样,快下载下来看看吧。
附例程一份:
[mw_shl_code=applescript,true]#include <DFRobot_utility.h>
#include <utility/DF_GPS.h>

DFGPS gps (Serial);
void setup () {
   Serial.begin (9600);
}

void loop () {
   int res = gps.read ();
   if (res) {
       if (gps.fix() == 1) {
           Serial.println ("fixed");
           Serial.print ("latitude=");
           Serial.println (gps.getLatitude ());
           Serial.print ("longitude=");
           Serial.println (gps.getLongitude());
           print_gps_data ();
       }
       gps.printGPGGA ();        //will always print
   }
}

void print_gps_data () {
   Serial.print ("getTime:        ");
   Serial.println (gps.getTime ());
   Serial.print ("getLatitude:        ");
   Serial.println (gps.getLatitude (), 6);
   Serial.print ("getLongitude:        ");
   Serial.println (gps.getLongitude (), 5);
   Serial.print ("fixc:        ");
   Serial.println (gps.fixc ());
   Serial.print ("getNum:        ");
   Serial.println (gps.getNum ());
   Serial.print ("getHDOP:        ");
   Serial.println (gps.getHDOP ());
   Serial.print ("getAltidude:        ");
   Serial.print (gps.getAltidude ());
   Serial.println (gps.getAunits ());

   Serial.print ("getLevel:        ");
   Serial.print (gps.getLevelStr ());
   Serial.println (gps.getLunits ());
   Serial.println ();
}

[/mw_shl_code]

dsweiliang  初级技神

发表于 2016-1-6 17:23:53

沙发
回复

使用道具 举报

丄帝De咗臂  高级技匠

发表于 2016-1-6 18:21:03

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail