数据格式解析(C++)
1. 开发环境Code::Blocks13.12,win7操作系统
2. 实现功能:
GPS数据信息类型常见的有6种:
信息类型 | 英文语义 | 中文语义 |
GPRMC | Recommended Minimum Specific GPS/TRANSIT Data(RMC) | 推荐定位信息 |
GPVTG | Track Made Good and Ground Speed(VTG) | 地面速度信息 |
GPGGA | Global Positioning System Fix Data(GGA) | 全球定位信息 |
GPGSA | GPS DOP and Active Satellites(GSA) | 当前卫星信息 |
GPGSV | GPS Satellites in View(GSV) | 可见卫星信息 |
GPGLL | Geographic Position(GLL) | 地理定位信息 |
各种数据类型尤其特定的数据格式,本例采用C++语言实现对各种数据格式的解析。由于工作量大,且$GPRMC这种格式最常见,因此本例这种介绍这种数据格式的解析。其它格式原理相同,可采用相同方法对其进行解析。
3. 项目简介:
本项目在Code::Blocks上创建控制台应用程序,逐条解释每个$GPRMC语句的语义。其它格式可做类似操作。
4.样例语句为:
$GPRMC,092427.604,V,4002.1531,N,11618.3097,E,0.000,0.00,280814,,E,N*08
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string GpsRecv="$GPRMC,092427.604,V,4002.1531,N,11618.3097,E,0.000,0.00,280814,,E,N*08";
int main()
{
int i,j;
bool Flag=true;
string str;
while(Flag)
{
if(GpsRecv.find("$GPRMC",0)==0) //从初始位置0开始查找"$GPRMC"子串
{
cout<<"$GPRMC数据"<<endl;
//截取以逗号分隔的字符串
for(i=j=0;GpsRecv[i]!='*';i++) //j为逗号计数器
{
if(GpsRecv[i]==',')
{
j++;
str=""; //str赋值为空,用以记录单个数据项
for(i++;GpsRecv[i]!=',' && GpsRecv[i]!='*';i++)
str+=GpsRecv[i];
i--;
switch(j) //对各个数据项分别处理
{
case 1:
str.insert(2,1,':'); //将时间以hh:mm:ss的格式输出
str.insert(5,1,':');
cout<<"时间(时分秒:hhmmss):"<<str<<endl;
break;
case 2:
if(str == "A")
cout<<"A表示有效数据"<<endl;
else if(str == "V")
cout<<"V表示无效数据"<<endl;
else
cout<<"非法数据"<<endl;
break;
case 3:
str.insert(2,"度");
str+="分";
cout<<"纬度(ddmm.mmmm):"<<str<<endl;
break;
case 4:
if(str == "N")
cout<<"N表示北纬"<<endl;
else if(str == "S")
cout<<"S表示南纬"<<endl;
else
cout<<"非法数据"<<endl;
break;
case 5:
str.insert(3,"度");
str+="分";
cout<<"经度(dddmm.mmmm):"<<str<<endl;
break;
case 6:
if(str == "E")
cout<<"E表示东经"<<endl;
else if(str == "W")
cout<<"W表示西经"<<endl;
else
cout<<"非法数据"<<endl;
break;
case 7:
cout<<"速度,(单位:节)"<<str<<endl;
break;
case 8:
cout<<"方位角,(单位:度)"<<str<<endl;
break;
case 9:
str.insert(4,"20");
str.insert(2,1,'-');
str.insert(5,1,'-');
cout<<"日期(UTC-ddmmyy):"<<str<<endl;
break;
case 10:
cout<<"磁偏角(000.0~180.0度):"<<str<<endl;
break;
case 11:
if(str == "E")
cout<<"磁偏角方向,E表示向东"<<endl;
else if(str == "W")
cout<<"磁偏角方向,W表示向西"<<endl;
else
cout<<"非法数据"<<endl;
break;
case 12:
if(str == "A")
cout<<"模式指示:A表示自主定位"<<str<<endl;
else if(str == "D")
cout<<"模式指示:D表示差分"<<str<<endl;
else if(str == "E")
cout<<"模式指示:E表示估算"<<str<<endl;
else if(str == "N")
cout<<"模式指示:N表示无效数据"<<str<<endl;
else
cout<<"数据非法"<<endl;
break;
default:
break;
}
}
}
Flag=false; //退出循环
}
}
return 0;
}
程序解析之后的结果如下图所示:
5.总结
本例从最基本的C++语法来解析GPS的语句格式,除C++本身的标准库,不用借助任何的程序库,控件或插件。其它各种格式的GPS数据格式可依次来解析。本例中直接声明了一条$GPRMC语句,省去了串口接收的工作过程。