织梦CMS - 轻松建站从此开始!

罗索

NMEA分析类

jackyhwei 发布于 2010-09-13 15:40 点击:次 
落鹤生:这是一个NMEA分析类,不错,如果你要研究GPS,包括GPS信息的接收,拆包,解析及坐标转换等功能,那你一定用得着这个类。同时附上一份NMEA协议语法说明。好东西一定要跟大家一起分享。
TAG:

头文件: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)

本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10148.html]
本文出处:百度博客 作者:zj41342626
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容