实例下载:http://download.csdn.net/detail/fcgksoso/3690014
前段时间做了GPS接收机的数据解析相关的开发工作,因为需要对GPS接收机的定位数据进行解析而阅读了novatel的某型号的主板说明说,对这方面有一些了解就记录下来,做个备忘。
目前在地球的外层的太空中上飞着用途各异的卫星,其中有一种是专门用来给地球上的人做空间定位而运行的卫星,这些卫星由多颗组成一个卫星定位系统,时时刻刻的环绕着地球运动,目前有以下几个卫星定位系统:美国的GPS、俄罗斯的GLONASS、欧洲的Galileo(伽利略)、中国的北斗Compass,后两者目前还未能实现投入正常使用。
这些定位卫星按照一定的轨迹分布在地球上空,使得在地球上任意一点都能够收到来自它们发射的卫星电文-也就是定位所需要用到的数据。这些卫星电文中包含着该卫星的一些运行数据,把这些数据编译调制成一定频率的电磁波按照一定频率向地球广播。在地球上通过接收机接收这些卫星信号,解析出其包含的数据,使用这些数据按一定算法进行计算就可以得到此时所在地球的准确的位置了。
卫星定位的原理大致是这样的:通过卫星发送数据可以计算出接收机与卫星的距离,只要有三颗以上的卫星距离就可以通过空间圆交汇的方法确定出此时接收机所在的空间点坐标,也就是地球上的经纬度了。
GPS接收机里的主板所干的事就是接收解析它收到的卫星电文,然后再将这些数据组织成一定协议格式的数据按需求输出。
这些定位数据是按一定格式组织的,比如说NMEA-0183协议格式,这是一个国际标准的导航数据标准协议。
除此之外还有一些生产GPS接收机主板厂商自己制定的协议格式,这会有一份很多页的说明说对其自身的数据进行详尽的说明。
要想从接收机的输出数据里获得到你想要的数据(如:经纬度、时间、卫星号、仰角、高度角、信噪比等),就必须要照相应的数据格式进行数据处理。
比如说这一条NMEA0183协议格式的数据:$GPGGA,134658.00,5106.9792,N,11402.3003,W,2,09,1.0,1048.47,M,-16.27,M,08,AAAA*60
其中包含了卫星时间,经纬度,高程等信息,这是明码形式的数据,也就是对于人看起来也是有意义的数据,这些数据大多是通过串口传输接收的,通过冲串口缓冲区中读取出来,再编写相应的代码对之进行处理。
以C#为例:
1.通过SerialPort类来实现数据的接收读取。
List<byte>COMbuffer = new List<byte>(4096);//串口数据处理缓冲区 int length = COM.BytesToRead; d = new byte[length];//串口数据临时数组 COM.Read(d, 0, length); COMbuffer.AddRange(d);//将临时数组里的数据存至数据处理缓冲区2.进行数据校验Xor校验、CRC32等校验方式
for (int i = 1; i < length; i++) { checkNum ^= inbytes[i];//从$号后一位开始逐位异或至*号前一位 }3.用Econding.Ascll.GetString()方法处理将二进制格式转为字符串格式。
4.Spilt()方法切割字符串,将相应的数据转为int或double类型的数据。
string[] datasplit = Encoding.ASCII.GetString(b, 0, b.Length).Split(new char[] { ',', '*' });if (s[1] == "" || s[2] == "" || s[4] == "" || s[3] == "" || s[5] == "" || s[9] == "") return; this.gga.GGAtime = Convert.ToDouble(s[1]); this.gga.Latitude = Convert.ToDouble(s[2]); this.gga.LatNS = Convert.ToChar(s[3]); this.gga.Longtitude = Convert.ToDouble(s[4]); this.gga.LngEW = Convert.ToChar(s[5]); this.gga.Evelvation = Convert.ToSingle(s[9]);
至此就完成的了解析。
GPS接收机常用的数据格式------二进制格式的数据,二进制格式数据的解析解析要比ASCLL格式的数据解析要简单。
以C#为例:
1..通过SerialPort类来实现数据的接收读取。
2.进行数据校验,通常是CRC32校验
for (int i = 0; i < length; i++) { checkNum = CRCTable[(checkNum ^ checkOutData[i]) & 0xFF] ^ (checkNum >> 8); }3.用BitConvert.ToInt32()或其他方法获取你所想要的数据。
this.Latitude = BitConverter.ToDouble(b, 36) * 100; this.Longitude = BitConverter.ToDouble(b, 44) * 100; this.Height = BitConverter.ToDouble(b, 52); this.LatitudeDeviation = BitConverter.ToSingle(b, 68); this.LongitudeDeviation = BitConverter.ToSingle(b, 72); this.HeightDeviation = BitConverter.ToSingle(b, 76);主板说明书里会详细的说明有关于数据的一切。
一条二进制数据的16进制显示:
数据头:AA44121C 01000240 20000000 1D1D0000 29160000 00004C00 55525A80
数据体:00000000 10000000 1B0450B3 F28E4940 16FA6BBE 7C825CC0 0060769F 449F9040 A62A82C1 3D000000
125ACB3F CD9E983F DB664040 00303030 00000000 00000000 0B0B0000 00060003校验码:42DC4C48
GPS数据解析大致是这样的。
我也只是刚入门,第一次写此类文章,意在培养好的习惯。
如果对你有帮助可以支持一下,如果有说错或不明的地方也请你不吝指出,我高兴去纠正,谢谢!
有疑问也可以写下,尽力为你解答^_^
更详尽的参考链接:http://blog.csdn.net/wuyazhe/article/details/5598945
GPS数据解析
最新推荐文章于 2023-03-06 16:56:54 发布