头文件:NMEAParser.h
////////////////////////////////////////////////////////////
#pragma once
////////////////////////////////////////////////////////////
#define DEF_NMEA_SENTENCE_FLAG_GLL ("$GPGLL")
#define DEF_NMEA_SENTENCE_FLAG_RMC ("$GPRMC")
#define DEF_NMEA_SENTENCE_FLAG_GSV ("$GPGSV")
#define DEF_NMEA_SENTENCE_FLAG_GSA ("$GPGSA")
#define DEF_NMEA_SENTENCE_FLAG_GGA ("$GPGGA")
#define DEF_NMEA_SENTENCE_FLAG_VTG ("$GPVTG")
////////////////////////////////////////////////////////////
class CNMEAParser
{
public:
CNMEAParser(void);
virtual ~CNMEAParser(void);
public:
void Import(char* _lpszStream,DWORD _dwStreamSize);
private:
void Parser1(char* _lpszSentence);
char* Parser2(char* _lpszSegment,char* _lpszBuffer);
private:
void ParserGLL(int _nFieldNum,char* _lpszFieldContents);
void ParserRMC(int _nFieldNum,char* _lpszFieldContents);
void ParserGSV(int _nFieldNum,char* _lpszFieldContents);
void ParserGSA(int _nFieldNum,char* _lpszFieldContents);
void ParserGGA(int _nFieldNum,char* _lpszFieldContents);
void ParserVTG(int _nFieldNum,char* _lpszFieldContents);
public:
//Global Positioning System Fix Data(GGA)GPS定位信息
char m_szUTCTime[15];//UTC时间,hhmmss(时分秒)格式
char m_szLatitude[15];//纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
char m_cLatitudeNOrS;//纬度半球N(北半球)或S(南半球)
char m_szLongitude[15];//经度dddmm.mmmm(度分)格式(前面的0也将被传输)
char m_cLongitudeEOrW;//经度半球E(东经)或W(西经)
char m_cState;//GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
char m_szSatelliticCount[3];//正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
char m_szAltitude[10];//海拔高度(-9999.9~99999.9)
char m_szSphereHeight[10];//地球椭球面相对大地水准面的高度
//GPS DOP and Active Satellites(GSA)当前卫星信息
char m_cMode;//模式,M=手动,A=自动
char m_cType;//定位类型,1=没有定位,2=2D定位,3=3D定位
char m_szPRN[12][3];//PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
char m_szPDOP[5];//PDOP位置精度因子(0.5~99.9)
char m_szHDOP[5];//HDOP水平精度因子(0.5~99.9)
char m_szVDOP[5];//VDOP垂直精度因子(0.5~99.9)
//GPS Satellites in View(GSV)可见卫星信息
//char m_szEyeableSatelliticCount[3];//可见卫星的总数(00~12,前面的0也将被传输)
//卫星仰角(00~90度,前面的0也将被传输)
//卫星方位角(000~359度,前面的0也将被传输)
//信噪比(00~99dB,没有跟踪到卫星时为空,前面的0也将被传输)
//Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息
char m_szFloorCourse[10];//地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
char m_szMagnetismWarpAngle[10];//磁偏角(000.0~180.0度,前面的0也将被传输)
char m_cMagnetismWarpAngleCourse;//磁偏角方向,E(东)或W(西)
//Track Made Good and Ground Speed(VTG)地面速度信息
char m_szFloorspeed[10];//地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
//Geographic Position(GLL)定位地理信息
char m_cDataAvailability;//定位状态,A=有效定位,V=无效定位
private:
char m_szAbirritation[201];
};
源代码:NMEAParser.cpp
#include "StdAfx.h"
#include "NMEAParser.h"
////////////////////////////////////////////////////////////
CNMEAParser::CNMEAParser(void)
{
memset(m_szUTCTime,0,sizeof(m_szUTCTime));
memset(m_szLatitude,0,sizeof(m_szLatitude));
memset(m_szLongitude,0,sizeof(m_szLongitude));
m_cState = '0';
memset(m_szSatelliticCount,0,sizeof(m_szSatelliticCount));
memset(m_szAltitude,0,sizeof(m_szAltitude));
memset(m_szSphereHeight,0,sizeof(m_szSphereHeight));
m_cMode = 'M';
m_cType = '1';
memset(m_szPRN,0,sizeof(m_szPRN));
memset(m_szPDOP,0,sizeof(m_szPDOP));
memset(m_szHDOP,0,sizeof(m_szHDOP));
memset(m_szVDOP,0,sizeof(m_szVDOP));
memset(m_szFloorCourse,0,sizeof(m_szFloorCourse));
memset(m_szMagnetismWarpAngle,0,sizeof(m_szMagnetismWarpAngle));
m_cMagnetismWarpAngleCourse = 'E';
memset(m_szFloorspeed,0,sizeof(m_szFloorspeed));
m_cDataAvailability = 'V';
memset(m_szAbirritation,0,sizeof(m_szAbirritation));
}
CNMEAParser::~CNMEAParser(void)
{
memset(m_szUTCTime,0,sizeof(m_szUTCTime));
memset(m_szLatitude,0,sizeof(m_szLatitude));
memset(m_szLongitude,0,sizeof(m_szLongitude));
m_cState = '0';
memset(m_szSatelliticCount,0,sizeof(m_szSatelliticCount));
memset(m_szAltitude,0,sizeof(m_szAltitude));
memset(m_szSphereHeight,0,sizeof(m_szSphereHeight));
m_cMode = 'M';
m_cType = '1';
memset(m_szPRN,0,sizeof(m_szPRN));
memset(m_szPDOP,0,sizeof(m_szPDOP));
memset(m_szHDOP,0,sizeof(m_szHDOP));
memset(m_szVDOP,0,sizeof(m_szVDOP));
memset(m_szFloorCourse,0,sizeof(m_szFloorCourse));
memset(m_szMagnetismWarpAngle,0,sizeof(m_szMagnetismWarpAngle));
m_cMagnetismWarpAngleCourse = 'E';
memset(m_szFloorspeed,0,sizeof(m_szFloorspeed));
m_cDataAvailability = 'V';
memset(m_szAbirritation,0,sizeof(m_szAbirritation));
}
void CNMEAParser::Import(char* _lpszStream,DWORD _dwStreamSize)
{
char* flag = NULL;
char buffer[201];
if (NULL != _lpszStream)
{
memcpy(buffer,_lpszStream,_dwStreamSize);
buffer[_dwStreamSize] = 0;
strcat(m_szAbirritation,buffer);
flag = strstr(m_szAbirritation,"\r\n");
while (NULL != flag)
{
*flag = 0;
Parser1(m_szAbirritation);
strcpy(m_szAbirritation,flag + 2);
flag = strstr(m_szAbirritation,"\r\n");
}
}
}
void CNMEAParser::Parser1(char* _lpszSentence)
{
char szBuffer[20];
int i = 1;
char* pfalgSentence = NULL;
char* pos = NULL;
pfalgSentence = strstr(_lpszSentence,DEF_NMEA_SENTENCE_FLAG_VTG);
if (NULL != pfalgSentence)
{
pos = _lpszSentence;
while ((NULL != pos) && (0 != *pos))
{
pos = Parser2(pos,szBuffer);
ParserVTG(i,szBuffer);
i ++;
}
return;
}
pfalgSentence = strstr(_lpszSentence,DEF_NMEA_SENTENCE_FLAG_GLL);
if (NULL != pfalgSentence)
{
pos = _lpszSentence;
while ((NULL != pos) && (0 != *pos))
{
pos = Parser2(pos,szBuffer);
ParserGLL(i,szBuffer);
i ++;
}
return;
}
pfalgSentence = strstr(_lpszSentence,DEF_NMEA_SENTENCE_FLAG_RMC);
if (NULL != pfalgSentence)
{
pos = _lpszSentence;
while ((NULL != pos) && (0 != *pos))
{
pos = Parser2(pos,szBuffer);
ParserRMC(i,szBuffer);
i ++;
}
return;
}
pfalgSentence = strstr(_lpszSentence,DEF_NMEA_SENTENCE_FLAG_GSV);
if (NULL != pfalgSentence)
{
pos = _lpszSentence;
while ((NULL != pos) && (0 != *pos))
{
pos = Parser2(pos,szBuffer);
ParserGSV(i,szBuffer);
i ++;
}
return;
}
pfalgSentence = strstr(_lpszSentence,DEF_NMEA_SENTENCE_FLAG_GSA);
if (NULL != pfalgSentence)
{
pos = _lpszSentence;
while ((NULL != pos) && (0 != *pos))
{
pos = Parser2(pos,szBuffer);
ParserGSA(i,szBuffer);
i ++;
}
return;
}
pfalgSentence = strstr(_lpszSentence,DEF_NMEA_SENTENCE_FLAG_GGA);
if (NULL != pfalgSentence)
{
pos = _lpszSentence;
while ((NULL != pos) && (0 != *pos))
{
pos = Parser2(pos,szBuffer);
ParserGGA(i,szBuffer);
i ++;
}
return;
}
}
char* CNMEAParser::Parser2(char* _lpszSegment,char* _lpszBuffer)
{
char* t;
char* pfalgComma1 = NULL;
char* pfalgComma2 = NULL;
pfalgComma1 = strstr(_lpszSegment,",");
if (NULL != pfalgComma1)
{
pfalgComma2 = strstr(pfalgComma1+1,",");
if (NULL == pfalgComma2)
{
pfalgComma2 = strstr(_lpszSegment,"*");
}
if (NULL != pfalgComma2)
{
if (NULL != _lpszBuffer)
{
t = pfalgComma1 + 1;
while (t < pfalgComma2)
{
*_lpszBuffer = *t;
_lpszBuffer ++;
t ++;
}
*_lpszBuffer = 0;
}
}
else
{
if (NULL != _lpszBuffer){*_lpszBuffer = 0;}
return NULL;
}
}
else
{
if (NULL != _lpszBuffer){*_lpszBuffer = 0;}
return NULL;
}
return pfalgComma2;
}
void CNMEAParser::ParserGLL(int _nFieldNum,char* _szFieldContents)
{
if (NULL == _szFieldContents)return;
switch (_nFieldNum)
{
case 6:
m_cDataAvailability = *_szFieldContents;//定位状态,A=有效定位,V=无效定位
break;
}
}
void CNMEAParser::ParserRMC(int _nFieldNum,char* _szFieldContents)
{
if (NULL == _szFieldContents)return;
switch (_nFieldNum)
{
case 8:
strcpy(m_szFloorCourse,_szFieldContents);//地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
break;
case 10:
strcpy(m_szMagnetismWarpAngle,_szFieldContents);//磁偏角(000.0~180.0度,前面的0也将被传输)
break;
case 11:
m_cMagnetismWarpAngleCourse = *_szFieldContents;//磁偏角方向,E(东)或W(西)
break;
}
}
void CNMEAParser::ParserGSV(int _nFieldNum,char* _szFieldContents)
{
}
void CNMEAParser::ParserGSA(int _nFieldNum,char* _szFieldContents)
{
if (NULL == _szFieldContents)return;
switch (_nFieldNum)
{
case 1:
m_cMode = *_szFieldContents;//模式,M=手动,A=自动
break;
case 2:
m_cType = *_szFieldContents;//定位类型,1=没有定位,2=2D定位,3=3D定位
break;
case 3:case 4: case 5:case 6:case 7:case 8:case 9:case 10:
case 11:case 12:case 13:case 14:
strcpy(m_szPRN[_nFieldNum-3],_szFieldContents);//PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
break;
case 15:
strcpy(m_szPDOP,_szFieldContents);//PDOP位置精度因子(0.5~99.9)
break;
case 16:
strcpy(m_szHDOP,_szFieldContents);//HDOP水平精度因子(0.5~99.9)
break;
case 17:
strcpy(m_szVDOP,_szFieldContents);//VDOP垂直精度因子(0.5~99.9)
break;
}
}
void CNMEAParser::ParserGGA(int _nFieldNum,char* _szFieldContents)
{
if (NULL == _szFieldContents)return;
switch (_nFieldNum)
{
case 1:
strcpy(m_szUTCTime,_szFieldContents);//UTC时间,hhmmss(时分秒)格式
break;
case 2:
strcpy(m_szLatitude,_szFieldContents);//纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
break;
case 3:
m_cLatitudeNOrS = *_szFieldContents;//纬度半球N(北半球)或S(南半球)
break;
case 4:
strcpy(m_szLongitude,_szFieldContents);//纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
break;
case 5:
m_cLongitudeEOrW = *_szFieldContents;//经度半球E(东经)或W(西经)
break;
case 6:
m_cState = *_szFieldContents;//GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
break;
case 7:
strcpy(m_szSatelliticCount,_szFieldContents);//正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
break;
case 9:
strcpy(m_szAltitude,_szFieldContents);//海拔高度(-9999.9~99999.9)
break;
case 10:
strcpy(m_szSphereHeight,_szFieldContents);//地球椭球面相对大地水准面的高度
break;
}
}
void CNMEAParser::ParserVTG(int _nFieldNum,char* _szFieldContents)
{
if (NULL == _szFieldContents)return;
switch (_nFieldNum)
{
case 4:
strcpy(m_szFloorspeed,_szFieldContents);//地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
break;
}
}
NMEA协议语法
1) 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也将被传输,如果不是差分定位将为空)
2) 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)
(zj41342626) |