http://www.gissky.net- GIS空间站

我要投稿 投稿指南 RSS订阅 网站资讯通告:
搜索: 您现在的位置: GIS空间站 >> 技术专栏 >> GPS应用 >> 正文

GPS应用开发设计文档

作者:vcbear    文章来源:CSDN    点击数:    更新时间:2007-2-14
摘要:本文介绍采用GPS接受模块,GIS控件开发GPS/GIS应用软件的一些要点。不涉及复杂的地理信息理论,主要是针对协议和接口的应用开发

1.1.2 NMEA消息的接收和解析

当接收机工作在NMEA协议时,以一定的速率向外输出数据。如

$GPGGA,140144.000,2232.2513,N,11401.6763,E,1,04,,20.3,M,,M,,0000*58

$GPGLL,2232.2513,N,11401.6763,E,140144.000,A*35

$GPRMC,140144.000,A,2232.2513,N,11401.6763,E,9.17,,140703,,*12

$GPVTG,,T,,M,9.17,N,17.0,K*47

$GPGGA,140148.000,2232.2654,N,11401.6738,E,1,04,,36.1,M,,M,,0000*5F

$GPGLL,2232.2654,N,11401.6738,E,140148.000,A*37

$GPRMC,140148.000,A,2232.2654,N,11401.6738,E,12.95,,140703,,*20

$GPVTG,,T,,M,12.95,N,24.0,K*77

 

最好将所有的消息输出速率设置为相同的(使用输入指令103),或者根据具体情况打开或关闭一些不不需要的消息。

消息里各字段的格式都不复杂,以下几个稍微注意:

l          经纬度的表示法为ddmm.mmmm和方向指示,以纬度举例:当纬度为9730.765,方向指示为N,则表示为北半球的9730.765.有的地理信息组件使用经纬度的时候不用度分秒表示法,而是用浮点数表示法,那么9730.765分就约等于97.597+30.765/60)度。

l          方向角以正北向为0度,正东向为90度,也就是顺时针方向从0度增加到359

l          校验码为一个消息包(包括消息头和体)里每个ASCII字符的值依次进行异或得到,算法(c++代码)如下

     unsigned char CheckSum(string s)

     {

         unsigned char c = 0;

         for(int o=1;o

         {

              unsigned char h = s[o];

              c ^= h;

         }

         return c;

     }

     sprintf(StrCheckSum,"*%02X",CheckSum(data) );

 

一般的地理数据,只取RMC消息包就够了,如果还需要其他的数据,比如当前卫星数,卫星状态等等,又或者接受机本身关闭了RMC消息包,只输出其他的消息包,那么就需要解析其他消息包。

应用程序逐行分析消息包。我的做法是先将消息包按逗号分割原则解析成一个字符数组,然后根据包头指令字,按协议含义取数组里的字符串。

ParseMessage(sMessage,Array)); //将一行消息解析到字符串数组Array

if (Array[0].CompareTo("$GPRMC") ==0  ) //RMC消息

{

    if(Array.size()!=12) //要求有12个字段

         return -1;

   //以下依次填充RMC数据结构

    recRMC Rmc

    Rmc.UTCTime                  = Array[1];

    Rmc.Status                   = Str2Char(Array[2]);

    Rmc.Latitude                 = Array[3];

    Rmc.Latitude.DirIndicator    = Str2Char(Array[4]);

    Rmc.Longitude                = Array[5];

    Rmc.Longitude.DirIndicator   = Str2Char(Array[6]);

    Rmc.SpeedOverGround          = Str2Num(Array[7]);

    Rmc.CourseOverGround         = Str2Num(Array[8]);

    Rmc.Date                    = Array[9];

    Rmc.Magnetic[0]              = Str2Char(Array[10]);

    Rmc.Checksum                 = (int)Str2Hex(Array[11]);

     //检查CheckSum,

    return  CheckSum(Rmc.CheckSum,sMessage)

}

以类似的方法构造解析其他消息的函数。组消息包则是依次将字段转成字符串连接起来,最后附加校验码即可。

 

1.2 SiFR协议.

SiFR协议是GPS模块厂商制定的二进制协议,提供了对GPS模块操作的更多接口,厂家号称此协议(用于操作本家的模块)更稳定,更高效,更容易操作。

1.2.1协议格式

消息头

消息体长度

消息体

校验码

消息结束符

双字节

0xA0

0xA2

双字节

长度小于1023字节的数据

双字节

双字节

0xB0

0xB3

具体消息格式可以参考厂家提供的协议文档(GPS.G2-X-01003-E.pdf)。

1.2.2 日志操作

SiFR包括了读取地理数据,刷写Flash,配置GPS模块参数,读取/擦写日志等一系列的操作。以日志操作最为有用。TimGPS可以脱离计算机运行,将所到之处的地理信息保存在内部存储器里,然后再接上计算机,获取地理信息日志,得到携带该GPS的载体在一段时间里运行轨迹。

读取Log的大致过程是 :

读取Log Sector信息,得到最小Sector号和最大Sector号,依次发指令读取每个SectorLog信息,并解析转换成NMEA协议消息。

擦除Log时,虽然u-blox提供了全部擦除指令,实际应用的时候发现该指令成功率不高。还是依次发指令逐个擦除比较好。

TimGPSlog格式定义在厂家提供的TIM_Data_Logger_Manual(GPS.G2-SW-02015).pdf里。

日志中包含的消息如下

消息号

消息名

字节数

内容

111

NONE 

1

无数据

100

FIX_FULL

9

全部地理定位信息

100

FIX_INCL

5

地理定位信息,增量数据

000

FIX_INCM

4

地理定位信息,增量数据, 在字节上比FIX_INCL少一个

110

FIX_INCS

3

地理定位信息,增量数据,使用更少的字节数

101

GPIO_FULL

GPIO General-purpose_input/output数据

011

GPIO_INC

2

GPIO数据,增量数据

001

ESCAPE

不定

用于扩展

以上所有消息都是二进制编码,按位存储,解析消息需要使用二进制位操作。

消息解析成功后,u-blox建议按以下逻辑处理这些消息

 

WHILE (Data) --读入新数据

--获取消息类型,并根据消息类型得到对应消息的字节数

IF (Type = EMPTY) THEN --  空数据,跳过

ELSE IF (Type = FIX_FULL) THEN - 保存时间信息,保存位置,速度和其他模式信息

ELSE IF ((Type = FIX_INCL) OR (Type = FIX_INCM) OR (Type = FIX_INCS)) THEN

-- 将时间和位置增量数据叠加到最近一个定位记录上,保存速度数据

ELSE IF (Type = GPIO_FULL) THEN -- 保存时间和GPIO数据

ELSE IF (Type = GPIO_INC) THEN  -- 叠加时间到最近一个GPIO数据的时间字段上,保存GPIO数据

ELSE IF (Type = ESCAPE) THEN   --处理自定义数据

-- END IF

END WHILE

 

上一页  [1] [2] [3] 下一页

Tags:GPS,NMEA,WGS 84  
责任编辑:gissky
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 中国地图