GPS 应用随笔

gps模块型号:移远通信GPS北斗模块双模定位L76K模块核心板

调试信息如下:(注意调试时天线可能需要移到室外或窗台)

[12:20:08.370]收←◆$GNGGA,042008.000,3150.72286,N,11707.89357,E,1,12,1.2,76.6,M,-5.0,M,,*6D
$GNGLL,3150.72286,N,11707.89357,E,042008.000,A,A*47
$GNGSA,A,3,06,13,15,195,199,,,,,,,,1.9,1.2,1.5,1*32
$GNGSA,A,3,07,16,19,21,35,39,40,,,,,,1.9,1.2,1.5,4*38
$GPGSV,2,1,07,06,17,116,29,11,,,27,13,62,169,41,15,35,215,24,0*56
$GPGSV,2,2,07,20,53,035,,195,61,134,40,199,51,162,32,0*59
$BDGSV,2,1,08,07,27,202,29,16,23,171,28,19,46,036,17,21,19,240,33,0*79
$BDGSV,2,2,08,35,73,181,37,39,31,166,37,40,23,192,38,59,,,34,0*40
$GNRMC,042008.000,A,3150.72286,N,11707.89357,E,0.00,172.36,120823,,,A,V*01
$GNVTG,172.36,T,,M,0.00,N,0.00,K,A*22
$GNZDA,042008.000,12,08,2023,00,00*4E
$GPTXT,01,01,01,ANTENNA OK*35

参考资料解析:

NMEA[GPS] 数据格式 

3.7数据消息 

NMEA数据消息如表3.6所示。

表3.6 数据消息

GPGGA

GPS定位信息

GPGLL

定位地理信息

GPGSA

当前卫星信息

GPGST

卫星伪距统计

GPGSV

可见卫星信息

GPRMC

推荐定位信息

GPRRE

伪距残差信息

GPVTG

地面速度信息

GPZDA

时间及日期信息

RD1

SBAS诊断信息(Crescent 专用NMEA消息)

PCSI,1

信标状态信息

3.7.1 GPGGA

      GPGGA消息包含详细的GPS定位数据,是使用频率最高的NMEA数据消息,消息格式为:

$GPGGA,HHMMSS.SS,DDMM.MMMM,S,DDDMM.MMMM,S,N,QQ,PP.P,SAAAAA.AA,M,±XXXX.XX,M,SSS,AAAA*CC<CR><LF>。

消息各组成部分如表3.7所示。

表3.7 GPGGA语句

hhmmss.ss

UTC时间,hhmmss(时分秒)格式

ddmm.mmmmmm

纬度ddmm.mmmmmm(度分)格式

s

纬度半球N(北半球)或S(南半球)

dddmm.mmmmm

经度ddmm.mmmmm(度分)格式

s

经度半球E(东经)或W(西经)

(6)    n

GPS状态,0=无定位,1=无差分校正定位,2=差分校正定位,9=用星历计算定位

qq

用于定位计算的卫星数目

pp.p

平面位置精度因子0.0~9.9

saaaa.aa

天线海拔高度

M

海拔高度单位(米)

?xxxx.xx

海平面分离度

M

海平面分离度单位(米)

sss

差分校正时延(单位:秒)

aaa

参考站识别

*cc

校验和

<CR><LF>

结束符

$GPGGA,010650.00,2307.594062,N,11321.993783,E, 1,07,1.1,31.1,M,-5.2,M,,*45
3.7.2 GPGLL

      GPGLL消息包含经纬度等信息,消息格式为:

$GPGLL,DDMM.MMMM,S,DDDMM.MMMM,S,HHMMSS.SS,S*CC<CR><LF>。

消息各组成部分如表3.8所示。

表3.8 GPGLL语句

ddmm.mmmmm

纬度ddmm.mmmmm度分格式

s

纬度半球N(北半球)或S(南半球)

dddmm.mmmmm

经度dddmm.mmmmm(度分)格式

s

经度半球E(东经)或W(西经)

hhmmss.ss

UTC时间,hhmmss(时分秒)格式

s

状态标志,A有效,V无效

*cc

校验和

<CR><LF>

结束符

3.7.3 GPGSA

      GPGSA消息包含GPS精度因子及当前参与定位计算的卫星信息。无效卫星的数据域为空域。消息格式为:

$GPGSA,A,B,CC,DD,EE,FF,GG,HH,II,JJ,KK,MM,NN,OO,P.P,Q.Q,R.R

*CC<CR><LF>

消息各组成部分如表3.9所示。

$GPGSA,M,3,02,04,10,12,13,17,23,28,,,,,1.8,0.9,1.6*32

表3.9 GPGSA语句

a

卫星捕获模式,M=手动设置(2D或3D),A=自动

b

定位模式,1=未定位,2=2D定位,3=3D定位

cc to oo

各卫星定位结果,未用卫星相应数据域为空

p.p

空间(三维)位置精度因子,取值1.0~9.9

q.q

平面位置精度因子,取值1.0~9.9

r.r

高度位置精度因子,取值1.0~9.9

*cc

校验和

<CR><LF>

结束符

3.7.4 GPGST

      GPGST语句包含全球导航卫星系统伪距错误统计信息。消息格式为:

$GPGST,HHMMSS.SS,A.A,B.B,C.C,D.D,E.E,F.F,G.G *CC<CR><LF>

消息各组成部分如表3.10所示。

表3.10 GPGST语句

hhmmss.ss

UTC时间,hhmmss(时分秒)格式

a.a

用于导航计算的伪距标准偏差的平方根值

b.b

椭球体长半轴标准偏差(单位:米)

c.c

椭球体短半轴标准偏差(单位:米)

d.d

椭球体长半轴方位(单位:度)

e.e

标准纬度偏差(单位:米)

f.f

标准经度偏差(单位:米)

g.g

标准高度偏差(单位:米)

*cc

校验和

<CR><LF>

结束符

3.7.5 GPGSV

      GPGSV语句包含GPS卫星信息,无效数据对应空域。消息格式为:

$GPGSV,3,2,11,10,21,212,45,12,12,318,42,13,23,100,42,17,59,072,48*71

$GPGSV,T,M,N,II,EE,AAA,SS,…II,EE,AAA,SS,*CC<CR><LF>

消息各组成部分如表3.11所示。

表3.11 GPGSV语句

t

GSV语句总数

m

本句GSV的编号

n

可见卫星的总数

ii

卫星编号

ee

卫星仰角(0~90度)

aaa

卫星方位角(0~359度)

ss

信噪比(dB)+30,ss=0~99

*cc

校验和

<CR><LF>

结束符

3.7.6 GPRMC

      GPRMC包含推荐最小定位信息。消息格式为:

$GPRMC,HHMMSS.SS,A,DDMM.MMM,N,DDDMM.MMM,W,Z.Z,Y.Y,DDMMYY,D.D,V *CC<CR><LF>

消息各组成部分如表3.12所示。

表3.12 GPRMC语句

hhmmss.ss

UTC时间,hhmmss(时分秒)格式

A

定位状态A=有效定位,V=无效定位

ddmm.mmmmm

纬度ddmm.mmmmm度分格式

N

纬度半球N(北半球)或S(南半球)

dddmm.mmmmm

经度dddmm.mmmmm(度分)格式

W

经度半球E(东经)或W(西经)

z.z

地面速率(单位:节)

y.y

地面航向(以真北为参考基准)

Ddmmyy

UTC日期, ddmmyy(年月日)格式

d.d

磁偏角(单位:度)

V

磁偏角方向,E(东)或W(西)

*cc

校验和

<CR><LF>

终止符

3.7.7 GPRRE

      GPRRE语句包含卫星伪距残差和估计定位错误信息,消息格式为:

$GPRRE,N,II,RR…II,RR,HHH.H,VVV.V *CC<CR><LF>

消息各组成部分如表3.13所示。

表3.13 GPRRE语句

n

跟踪卫星数目

ii

使用卫星编号(用于解算的4颗)

rr

伪距残差(单位:米)

hhh.h

水平位置错误估计

vvv.v

垂直位置错误估计

*cc

校验和

<CR><LF>

终止符

3.7.8 GPVTG

      GPVTG语句包含速度和航向信息。消息格式为:

$GPVTG,TTT,C,TTT,C,GGG.GG,U,GGG,GG,U*CC<CR><LF>

消息各组成部分如表3.14所示。

表3.14 GPVTG语句

ttt

以真北为参考基准的地面航向(000~359度)

c

航向标志位,通常c=T

ttt

以磁北为参考基准的地面航向(000~359度)

c

航向标志位通常c=M

ggg.gg

地面速率(000~999节)

u

速率单位:海里,u=N,

ggg.gg

地面速率(000~999公里)

u

速率单位:公里,u=K

*cc

校验和

<CR><LF>

终止符

3.7.9 GPZDA

      GPZDA语句包含全球时间信息。消息格式为:

$GPZDA,HHMMSS.SS,DD,MM,YYYY,XX,YY*CC<CR><LF>

消息各组成部分如表3.15所示。

$GPZDA,010708.00,05,04,2007,00,00*6C

表3.15 GPZDA语句

hhmmss.ss

UTC时间,hhmmss(时分秒)格式

dd

日期,dd=0~31

mm

月,mm=1~12

yyyy

xx

当地时域描述,单位:小时,xx=-13~13

yy

当地时域描述,单位:分,yy=0~59

*cc

校验和

<CR><LF>

终止符

代码解析参考:

scanf这个函数,scanf可以从标准输入流读取与指定格式相符的数据。sscanf则是从const char *str中读取。它的强大之处在于可以方便地从字符串中取出整数、浮点数和字符串等各种类型的数据,而且它还具有类似于正则表达式的匹配功能,sscanf默认是以空格分隔字符串的,如果不是以空格来分割的话,就可以使用%[ ]来指定分割的条件。如%[a-z]表示读取a到z的所有字符,%[^a-z]表示过滤a-z之间的所有字符,即只要遇到a到z之间的任意字符,转换立刻停止。比如:
sscanf(“abcdefABCDEF”, “%[^A-Z]”, str);
printf(“%s/n”, str);
result is: abcdef
%[^A-Z]这样的匹配格式为我们取遇到大写字母为止的字符串。利用这种匹配方式,我们就可以灵活的操作字符串,得到我们想要的结果。

以推荐gps信息$GPRMC开头的一行信息,然后从中解析出经纬度、日期时间等有效信息即可。


typedef struct gps_info
{
        char utc_time[10];
        char status;
        float latitude_value;
        char latitude;
        float longtitude_value;
        char longtitude;
}GPS_INFO;

通过ANSI C提供的strstr()函数找到以$GPRMC开头以换行符’/n’结束的字符串:

char *gps_string    = NULL; 
     GPS_INFO *rmc_info=NULL; 
    /* find "$GPRMC" from g_aucUart2RxBuff */
 

if ((gps_string = strstr((char *)g_aucUart2RxBuff, "$GNRMC")) != NULL)
    {
        for (u8 i=0; i<strlen(gps_string); i++)
        {
                if(gps_string[i] == '\n')
                {
                        gps_string[i] = '\0'; //replace ‘/n’ with null
                }
        }
  
    
//$GNRMC,042008.000,A,3150.72286,N,11707.89357,E,0.00, 172.36,120823,,,A,V*01

   sscanf(gps_string,"$GNRMC,%[^,],%c,%f,%c,%f,%c",
            rmc_info->utc_time,&(rmc_info->status),&(rmc_info->latitude_value),&(rmc_info->latitude),
            &(rmc_info->longtitude_value),&(rmc_info->longtitude));
    
    }


GNRMC每个字段的含义如下:
$GNRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HalfMonk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值