一、nmea数据格式介绍
nmea数据如下:
$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D
$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54
$GNRMC,230134.00,A,2237.12422,N,11408.08310,E,9.291,215.59,310518,,,A*75
$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04
$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D
$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70
$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E
$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D
说明:NMEA0183格式以“$”开始,主要语句有GPGGA,GPVTG,GPRMC等
1、 GPS DOP and Active Satellites(GSA)当前卫星信息
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF>
<1>模式 :M = 手动, A = 自动。
<2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。
<4> PDOP位置精度因子(0.5~99.9)
<5> HDOP水平精度因子(0.5~99.9)
<6> VDOP垂直精度因子(0.5~99.9)
<7> Checksum.(检查位).
2、 GPS Satellites in View(GSV)可见卫星信息
$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF>
<1> GSV语句的总数
<2> 本句GSV的编号
<3> 可见卫星的总数,00 至 12。
<4> 卫星编号, 01 至 32。
<5>卫星仰角, 00 至 90 度。
<6>卫星方位角, 000 至 359 度。实际值。
<7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。
<8>Checksum.(检查位).
第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。
3、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(时分秒)格式
<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也将被传输,如果不是差分定位将为空)
4、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(时分秒)格式
<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=数据无效)
5、 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=数据无效)
二、gps数据解析与生成类
-
/
/CommonFunction.h
-
#pragma once
-
-
#include
<
string
>
-
#include
<vector
>
-
-
/
/ 字符串分割
-
int StringSplit(std
::vector
<std
::
string
>
& dst, const std
::
string
& src, const std
::
string
& separator);
-
-
/
/ 去掉前后空格
-
std
::
string
& StringTrim(std
::
string
&str);
-
/
/CommonFunction.cpp
-
#include
"stdafx.h"
-
#include
"CommonFunction.h"
-
-
/
/ 字符串分割
-
int StringSplit(std
::vector
<std
::
string
>
& dst, const std
::
string
& src, const std
::
string
& separator)
-
{
-
if (src.empty() || separator.empty())
-
return
0;
-
-
int nCount
=
0;
-
std
::
string temp;
-
size_t pos
=
0, offset
=
0;
-
-
/
/ 分割第
1~n-
1个
-
while ((pos
= src.find_
first_
of(separator, offset)) !
= std
::
string
::npos)
-
{
-
temp
= src.substr(offset, pos
- offset);
-
if (temp.
length()
>=
0) {
-
dst.push_back(temp);
-
nCount
+
+;
-
}
-
offset
= pos
+
1;
-
}
-
-
/
/ 分割第n个
-
temp
= src.substr(offset, src.
length()
- offset);
-
if (temp.
length()
>=
0) {
-
dst.push_back(temp);
-
nCount
+
+;
-
}
-
-
return nCount;
-
}
-
-
/
/去前后空格
-
std
::
string
& StringTrim(std
::
string
&str)
-
{
-
if (str.empty()) {
-
return str;
-
}
-
str.erase(
0, str.find_
first_
not_
of(
" "));
-
str.erase(str.find_
last_
not_
of(
" ")
+
1);
-
return str;
-
}
-
/
/GpsNmeaData.h
-
/
/gps nmea 数据解析与生成
-
-
#pragma once
-
#include
"CommonFunction.h"
-
-
/
/gpsdata格式
-
enum GpsDataFormat
-
{
-
GpsDataFormat_None
=
0,
/
/none
-
GpsDataFormat_GNRMC
=
1,
/
/GNRMC
-
GpsDataFormat_GPRMC
=
2,
/
/GPRMC
-
GpsDataFormat_GPGGA
=
3,
/
/GPGGA
-
};
-
-
/
/
Status
-
enum GpsStatus
-
{
-
GpsStatus_
Valid
=
'A',
/
/数据有效(GPRMC
/GNRMC)
-
GpsStatus_
Invalid
=
'V',
/
/数据无效(GPRMC
/GNRMC)
-
GpsStatus_NoLocation
=
'0',
/
/未定位(GPGGA)
-
GpsStatus_NoDiffLocation
=
'1',
/
/非差分定位(GPGGA)
-
GpsStatus_DiffLocation
=
'2',
/
/差分定位(GPGGA)
-
GpsStatus_Estimating
=
'6',
/
/正在估算(GPGGA)
-
};
-
-
/
/纬度方向
-
enum GpsLatDirect
-
{
-
GpsLatDirect_N
=
'N',
/
/北纬
-
GpsLatDirect_S
=
'S',
/
/南纬
-
};
-
-
/
/经度方向
-
enum GpsLngDirect
-
{
-
GpsLngDirect_E
=
'E',
/
/东经
-
GpsLngDirect_W
=
'W',
/
/西经
-
};
-
-
/
/磁偏角方向,E
=东,W
=西
-
enum GpsDeclinationDirect
-
{
-
GpsDeclinationDirect_
Invalid
=
'0',
-
GpsDeclinationDirect_E
=
'E',
-
GpsDeclinationDirect_W
=
'W',
-
};
-
-
/
/模式,A
=自动,D
=差分,E
=估测,N
=数据无效
-
enum GpsMode
-
{
-
GpsMode_A
=
'A',
-
GpsMode_D
=
'D',
-
GpsMode_E
=
'E',
-
GpsMode_N
=
'N',
-
};
-
-
class GpsNmeaData
-
{
-
public:
-
GpsNmeaDat
a();
-
virtual ~GpsNmeaDat
a();
-
-
/
/设置初始gps数据格式
-
void SetInitGpsDataFormat(unsigned char ucInitGpsDataFormat);
-
-
/
/加载GPS字符串
-
bool LoadGPSString(char
*pInputString, bool bIsCompareChecksum
=
true);
-
/
/生成GPS字符串
-
bool CreateGPSString(char
*pOutputString, int
& nOutputStringSize, bool bIsHasEndFlag);
-
-
/
/加载GPRMC字符串
-
bool LoadGPRMCString(char
*pInputString,std
::vector
<std
::
string
> vecValue,bool bIsCompareChecksum
=
true);
-
/
/生成GPRMC字符串
-
bool CreateGPRMCString(char
*pOutputString, int
& nOutputStringSize,bool bIsHasEndFlag);
-
-
/
/加载GNRMC字符串
-
bool LoadGNRMCString(char
*pInputString,std
::vector
<std
::
string
> vecValue, bool bIsCompareChecksum
=
true);
-
/
/生成GNRMC字符串
-
bool CreateGNRMCString(char
*pOutputString, int
& nOutputStringSize, bool bIsHasEndFlag);
-
-
/
/加载GPGGA字符串
-
bool LoadGPGGAString(char
*pInputString, std
::vector
<std
::
string
> vecValue, bool bIsCompareChecksum
=
true);
-
/
/生成GPGGA字符串
-
bool CreateGPGGAString(char
*pOutputString, int
& nOutputStringSize, bool bIsHasEndFlag);
-
-
/
/计算经纬度(根据速度和方向计算下一经纬度)
-
void CalcLngLat(float fDirect, float fSpeed, double dOldLng, double dOldLat, double
& dNewLng, double
& dNewLat);
-
void CalcLngLatEx(float fDirect, float fSpeed, double dOldLng, double dOldLat, double
& dNewLng, double
& dNewLat, int nKeepSeconds
=
1);
-
/
/计算经纬度(根据距离和方向计算下一经纬度)
-
void CalcLngLatByDistanceAndDirect(float fDirect, double fDistance, double dOldLng, double dOldLat, double
& dNewLng, double
& dNewLat);
-
-
/
/获取与设置参数
-
void GetLng(double
& fLng,unsigned char
& ucDirect);
-
void SetLng(double fLng, unsigned char ucDirect);
-
-
void GetLat(double
& fLat,unsigned char
& ucDirect);
-
void SetLat(double fLat, unsigned char ucDirect);
-
-
float GetSpeed();
-
void SetSpeed(float fSpeed);
-
-
float GetDirect();
-
void SetDirect(float fDirect);
-
-
unsigned char GetStatus();
-
void SetStatus(unsigned char ucStatus);
-
-
unsigned char GetDeclination();
-
void SetDeclination(unsigned char ucDeclination);
-
-
unsigned char GetDeclinationDirect();
-
void SetDeclinationDirect(unsigned char ucDeclinationDirect);
-
-
unsigned char GetMode();
-
void SetMode(unsigned char ucMode);
-
-
unsigned char GetSatelliteNum();
-
void SetSatelliteNum(unsigned char ucSatelliteNum);
-
-
float GetHDOP();
-
void SetHDOP(float fHDOP);
-
-
float GetHigh();
-


最低0.47元/天 解锁文章
8902

被折叠的 条评论
为什么被折叠?



