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=用星历计算定位 |
| 用于定位计算的卫星数目 |
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=数据无效)