0%

GPS报文解析

GPS模块

商品链接:Beitian北天高精度GPS模块NEO-M8M陶瓷天线GPS北斗GLONASS三模GNSS授时BN-357

输出协议:NMEA-0183协议

NMEA-0183协议

<CR> 回车,(ASCII 13, \r)
<LF> 换行,(ASCII 10, \n)
hh 报文$到*之间数据的异或校验

RMC

Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息

报文:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
<1> UTC 时间,hhmmss.sss(时分秒)格式
<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=数据无效)

GGA

Global Positioning System Fix Data(GGA)GPS 定位信息

报文:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
<1> UTC 时间,hhmmss.sss(时分秒)格式
<2> 纬度ddmm.mmmm(度分)格式(前面的0 也将被传输)
<3> 纬度半球N(北半球)或S(南半球)
<4> 经度dddmm.mmmm(度分)格式(前面的0 也将被传输)
<5> 经度半球E(东经)或W(西经)
<6> GPS 状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
<7> 正在使用解算位置的卫星数量(00~12)(前面的0 也将被传输)
<8> HDOP 水平精度因子(0.5~99.9)
<9> 海拔高度(-9999.9~99999.9)
<10> 地球椭球面相对大地水准面的高度
<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空
<12> 差分站ID 号0000~1023(前面的0 也将被传输,如果不是差分定位将为空)

GSA

GPS DOP and Active Satellites(GSA)当前卫星信息

报文:$GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>,<6>*hh<CR><LF>
<1> 模式,M=手动,A=自动
<2> 定位类型,1=没有定位,2=2D 定位,3=3D 定位
<3> PRN 码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0 也将被传输)
<4> PDOP 位置精度因子(0.5~99.9)
<5> HDOP 水平精度因子(0.5~99.9)
<6> VDOP 垂直精度因子(0.5~99.9)

GSV

报文:$GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,…<4>,<5>,<6>,<7>*hh<CR><LF>

<1> GSV 语句的总数
<2> 本句GSV 的编号
<3> 可见卫星的总数(00~12,前面的0 也将被传输)
<4> PRN 码(伪随机噪声码)(01~32,前面的0 也将被传输)
<5> 卫星仰角(00~90 度,前面的0 也将被传输)
<6> 卫星方位角(000~359 度,前面的0 也将被传输)
<7> 信噪比(00~99dB,没有跟踪到卫星时为空,前面的0 也将被传输)
注:<4>,<5>,<6>,<7>信息将按照每颗卫星进行循环显示,每条GSV 语句最多可以显示4 颗卫星的信息。其他卫星信息将在下一序列的NMEA0183 语句中输出。

VTG

Track Made Good and Ground Speed(VTG)地面速度信息

报文:$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh<CR><LF>
<1> 以真北为参考基准的地面航向(000~359 度,前面的0 也将被传输)
<2> 以磁北为参考基准的地面航向(000~359 度,前面的0 也将被传输)
<3> 地面速率(000.0~999.9 节,前面的0 也将被传输)
<4> 地面速率(0000.0~1851.8 公里/小时,前面的0 也将被传输)
<5> 模式指示(仅NMEA0183 3.00 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

GLL

Geographic Position(GLL)定位地理信息

报文:$GPGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*hh<CR><LF>
<1> 纬度ddmm.mmmm(度分)格式(前面的0 也将被传输)
<2> 纬度半球N(北半球)或S(南半球)
<3> 经度dddmm.mmmm(度分)格式(前面的0 也将被传输)
<4> 经度半球E(东经)或W(西经)
<5> UTC 时间,hhmmss(时分秒)格式
<6> 定位状态,A=有效定位,V=无效定位
<7> 模式指示(仅NMEA0183 3.00 版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

str转int/float函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
int hexStr2Int(char *pStr)
{
int num = 0;
while(1)
{
if(*pStr >= '0' && *pStr <= '9')
{
num *= 16;
num += *pStr - '0';
pStr++;
}
else if(*pStr >= 'a' && *pStr <= 'f')
{
num *= 16;
num += *pStr - 'a' + 10;
pStr++;
}
else if(*pStr >= 'A' && *pStr <= 'F')
{
num *= 16;
num += *pStr - 'A' + 10;
pStr++;
}
else
{
break;
}
}
return num;
}

int decStr2Int(char *pStr)
{
int num = 0;
char isMinus = 0;
if(*pStr == '-')
{
isMinus = 1;
pStr++;
}
while(*pStr >= '0' && *pStr <= '9')
{
num *= 10;
num += *pStr - '0';
pStr++;
}
if(isMinus)
num = -num;
return num;
}

float str2Float(char *pStr)
{
int intNum = 0;
float num = 0;
char isMinus = 0;
intNum = decStr2Int(pStr);
if(*pStr == '-')
{
isMinus = 1;
pStr++;
}
while(*pStr >= '0' && *pStr <= '9')
{
pStr++;
}
if(*pStr == '.')
{
pStr++;
if(*pStr >= '0' && *pStr <= '9')
{
num = decStr2Int(pStr);
}
while(*pStr >= '0' && *pStr <= '9')
{
num /= 10.f;
pStr++;
}
}
if(isMinus)
num = intNum - num;
else
num = intNum + num;
return num;
}

查找char和异或校验函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
inline uint16_t findChar(uint8_t findValue, uint8_t *pStr, uint16_t size)
{
uint16_t i = 0;
for(i = 0; i < size; i++, pStr++)
{
if(*pStr == findValue)
return i;
}
return 0xffff;
}

inline uint8_t calcXorCheck(uint8_t *pStart, uint8_t *pEnd)
{
uint8_t ret = 0;
while(pStart < pEnd)
{
ret ^= *pStart;
pStart++;
}
return ret;
}

utcTime增加一秒函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
uint32_t gps_addSecondUtcTime(uint32_t now)
{
uint8_t hh, mm, ss;
ss = now%100;
if(ss < 59)
{
now++;
}
else
{
ss = 0;
mm = (now/100)%100;
hh = (now/10000)%100;
if(mm < 59)
{
mm++;
}
else
{
mm = 0;
if(hh < 23)
{
hh++;
}
else
{
hh = 0;
}
}
now = hh*10000 + mm*100 + ss;
}
return now;
}

解析函数

Github:https://github.com/hao0527/gps_data_parse