数据格式解析(C++)

数据格式解析(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语句,省去了串口接收的工作过程。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值