GPS数据格式解析源代码举例

GPS数据格式的分析 GPS数据分析 阅读详情

本文转自:http://norke.blog.163.com/blog/static/2765720820116185028104/


GPS数据格式解析源代码举例

 

随着内置GPS的手机越来越多,GPS相关的应用也越来越广泛,GPS已经不仅仅只是得到一个经纬度的信息,可以通过GPS开发出更多的应用,比如位置图片,比如好友位置显示,比如跟踪等等,TimeSyncPPC就是可以使用GPS的时钟来进行时间同步的。
    
    所有这些功能都需要知道GPS的数据格式并能够解析出自己需要的数据出来。下面就以TimeSyncPPC中如何得到GPS的日期和时间为例来说明如何解析GPS数据。
    
    TimeSyncPPC是用于Pocket PC上的时间同步工具,因此得到GPS的时间和日期,使用的GPS的指令是$GPRMC,其指令格式如下:
    
    $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11> 

      1) 标准定位时间(UTC time)格式:时时分分秒秒.秒秒秒(hhmmss.sss)。 
      2) 定位状态,A = 数据可用,V = 数据不可用。 
      3) 纬度,格式:度度分分.分分分分(ddmm.mmmm)。 
      4) 纬度区分,北半球(N)或南半球(S)。 
      5) 经度,格式:度度分分.分分分分。
      6) 经度区分,东(E)半球或西(W)半球。 
      7) 相对位移速度, 0.0 至 1851.8 knots 
      8) 相对位移方向,000.0 至 359.9度。实际值。 
      9) 日期,格式:日日月月年年(ddmmyy)。 
      10) 磁极变量,000.0 至180.0。 
      11) 度数。 
      12) Checksum.(检查位) 

    从数据格式中可以看出,我们需要得到1和9两个字段的数据即可。
    
    当然,使用GPS首先要打开GPS的串口,代码如下:  
HANDLE OpenCom(CString strCom, DWORD BaudRate, BYTE ByteSize, BYTE StopBits, BYTE Parity, int FlowControl)
{
    HANDLE  hCommPort;

    CString strTemp;

    if((hCommPort = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE, 0,
                        NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE)
    {
        return NULL;
    }
    
    DCB          commDCB;
    CString      strWinText;

    GetCommState(hCommPort, &commDCB);

    commDCB.BaudRate    = BaudRate;
    commDCB.ByteSize    = ByteSize;
    commDCB.StopBits    = StopBits;
    commDCB.fParity        = (NOPARITY == Parity) ? FALSE : TRUE;
    commDCB.Parity        = Parity;

    commDCB.fDsrSensitivity = FALSE;
    commDCB.fDtrControl     = DTR_CONTROL_ENABLE;

    if(FlowControl == 1)    // Hardware
    {
        // Enable RTS/CTS Flow Control
        commDCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
        commDCB.fOutxCtsFlow = 1;
        commDCB.fOutX = 0;
        commDCB.fInX = 0;
    }
    else if(FlowControl == 0)    // Software
    {
        // Enable XON/XOFF Flow Control
        commDCB.fRtsControl = RTS_CONTROL_ENABLE;
        commDCB.fOutxCtsFlow = 0;
        commDCB.fOutX = 1;
        commDCB.fInX  = 1;  
    }
    else
    {
        commDCB.fRtsControl = RTS_CONTROL_ENABLE;
        commDCB.fOutxCtsFlow = 0;
        commDCB.fOutX = 0;
        commDCB.fInX  = 0;
    }

    SetCommState(hCommPort, &commDCB);

    return hCommPort;
}    

    串口打开后需要得到一行GPS数据,GPS数据是以结束,代码如下:
// 返回值为-1:超时,其他值为数据长度
int GetGPSLineData(HANDLE hCommPort, char *ReadBuf, int Length)
{
    // 读一行GPS数据
    DWORD nBytes;
    int i = 0;
    DWORD TimeOut = 0;
    while(i < Length)
    {
        if(g_isQuit)
            return i;

        TimeOut ++;
        if(TimeOut >= 100)
            return -1;

        ReadFile(hCommPort, (LPVOID)&ReadBuf[i], 1, &nBytes, NULL);
        if(nBytes == 0)
        {
            Sleep(1);
            continue;
        }

        TimeOut = 0;

        if(ReadBuf[i] == 0x0d)
        {
            ReadBuf[i] = 0;
            break;
        }
        if(ReadBuf[i] == 0x0a)
        {
            continue;
        }

        i ++;
    }

    return i;
}    

    下面是解析一行GPS数据,将数据结果存储在一个数组中,代码如下:
// 解析一行GPS数据
int AnalyzeGPSData(char *GPSData, int Length, char Command[][100])
{
    int i = 0;
    int j = 0, k = 0;
    while(i < Length)
    {
        if(GPSData[i] == ',')
        {
            Command[j][k] = 0;
            j ++;
            k = 0;
            i ++;
            continue;
        }
        Command[j][k] = GPSData[i];
        k ++;
        i ++;
    }

    return j;
}
解析之后的GPS数据包含命令和参数,下面就是判断是否是我们需要的命令,如果是得到第一个和第九个参数即可。不过要注意,GPS时间是世界标准时间,因此要转换成本地时间,代码如下:
DWORD WINAPI GetGPSTime(LPVOID lpParameter)
{
    char ReadBuf[1000];
    DWORD TimeOut = 0;
    
    char Command[40][100];

    HANDLE hCommPort = OpenCom(g_strComPort, g_BaudRate);
    if(hCommPort == NULL)
    {
        MessageBox(NULL, _T("Can not open COM port!"), NULL, MB_OK | MB_TOPMOST);
        goto GPSExit;
    }

    while(1)
    {    
        if(g_isQuit)
            break;

        // 读一行GPS数据
        int Length = GetGPSLineData(hCommPort, ReadBuf, 999);
        if(Length == -1)
        {
            TimeOut ++;
            if(TimeOut < 100)
                continue;
        }

        if(TimeOut >= 100)
        {
            MessageBox(NULL, _T("Read GPS data timeout!"), NULL, MB_OK | MB_TOPMOST);
            goto GPSExit;
        }
        TimeOut = 0;

        AnalyzeGPSData(ReadBuf, Length, Command);
        
        if(strcmp(Command[0], "$GPRMC") == 0)
        {
            SYSTEMTIME st, LocalSt;

            st.wHour = (Command[1][0] - '0') * 10 + (Command[1][1] - '0');
            st.wMinute = (Command[1][2] - '0') * 10 + (Command[1][3] - '0');
            st.wSecond = (Command[1][4] - '0') * 10 + (Command[1][5] - '0');
            st.wMilliseconds = (Command[1][7] - '0') * 100 + (Command[1][8] - '0') * 10 +  (Command[1][9] - '0');

            st.wDay = (Command[9][0] - '0') * 10 + (Command[9][1] - '0');
            st.wMonth = (Command[9][2] - '0') * 10 + (Command[9][3] - '0');
            st.wYear = (Command[9][4] - '0') * 10 + (Command[9][5] - '0') + 2000;

            FILETIME FileTime, LocalFileTime;
            SystemTimeToFileTime(&st, &FileTime);
            FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
            FileTimeToSystemTime(&LocalFileTime, &LocalSt);

            g_GPSDateCtrl->SetTime(LocalSt);
            g_GPSTimeCtrl->SetTime(LocalSt);
            if(strcmp(Command[2], "A") == 0)
            {

                BOOL ret = SetSystemTime(&st);
                MessageBox(NULL, _T("SyncTime Success!"), _T(""), MB_OK | MB_TOPMOST);

                strGPSButton = _T("Get GPS Time");
                g_ThisDlg->SetDlgItemText(IDC_GETGPSTIME, strGPSButton);
                g_ThisDlg->GetDlgItem(IDC_SETGPSTIME)->EnableWindow(0);

                break;
            }
            else
            {
                TimeOut ++;
            }
        }
        
    }

GPSExit:

    if(hCommPort != NULL)
        CloseHandle(hCommPort);

    g_GetGPSTimeThread = NULL;

    strGPSButton = _T("Get GPS Time");
    g_ThisDlg->SetDlgItemText(IDC_GETGPSTIME, strGPSButton);
    g_ThisDlg->GetDlgItem(IDC_SETGPSTIME)->EnableWindow(0);
    
    return TRUE;
}    

    如果需要解析其他指令,可以参考函数DWORD WINAPI GetGPSTime(LPVOID lpParameter)的实现方法,其实还是比较简单的。
    
    这些代码已经在TimeSyncPPC中测试过,可以直接使用,开发环境为VS2005,Windows Mobile 6.1 for PPC。如有疑问请在下方留言

2020/10/23 GPS的数据格式学习 GPS的数据格式学习 1、 阅读详情

相关推荐

Apollo添加新的can通信接口的GPS设备

首先Novatel的组合惯导价格昂贵,非批量的价格好像在20万左右(一年前的报价); 其次,由于早期使用了国产广州导元电子的组合惯导550D ,使用起来也还不错。因此懒得换成最近百度新支持的几款设备了。 原来GPS 的驱动都是同事写的,最近我开始加入coding因此开始了解具体过程。 Apollo官方给了一个如何添加教程GPS 的教程。这个教程主要包含如下步骤: 通过继承基类“Parser”,实现新GPS接收器的数据解析器 在Parser类中为新GPS接收器添加新接口 在文件config.proto中,

Parker盘的博客 1837

基于STM32的GPS实时授时系统.pdf

基于STM32的GPS实时授时系统.pdf

从Urbannav真值话题到NavSatFix:手把手教你转换GPS数据格式用于ROS定位评估

本文详细介绍了如何将Urbannav数据集中的Novatel INSPVAX格式GPS数据转换为ROS标准的NavSatFix格式,用于定位算法评估。通过搭建ROS工作环境、解析trans_GPS节点转换逻辑、验证数据质量等步骤,帮助开发者解决多传感器融合中的格式兼容问题,提升定位评估效率。

weixin_28724319的博客 136

GPS解析

c

u014421313的博客 4943

C语言实现GPS解码——详细教程附源代码

NMEA协议定义了一系列标准的数据语句,包括GGA、RMC、VTG等。在本例中,我们将关注RMC语句,它包含了位置、速度和时间等关键信息。在本文中,我们将介绍如何使用C语言解码GPS数据。通过解码GPS数据,我们可以获取位置、速度和时间等信息。通过解码GPS数据,你可以获取到有关位置、速度和时间等信息,为实现各种应用提供了基础。如上所示,我们成功地解码了RMC语句,并获取了关键的GPS数据。函数打印解码后的数据,包括状态、纬度、经度、速度和日期等信息。的结构体,用于存储解码后的GPS数据。

CyberFlare的博客 1094

GPS电文解析实战项目

本文还有配套的精品资源,点击获取 简介:GPS电文解析是理解GPS数据的关键步骤,本实战项目将带你深入了解GPS电文格式,包括GPGGA报文。通过解析和评估电文质量,你可以优化GPS定位性能并进行各种应用。本项目提供源代码,涵盖NMEA电文解析、数据校验、实时处理和坐标转换,帮助你掌握GPS电文解析的实际应用。 1. GPS电文解析简介 GPS电文解析是将GPS...

weixin_42146230的博客 1445

解析GPS数据(长字符串解析示例)

文章目录1、ATGM336H模块介绍2、驱动编写3、源码 这里GPS一般返回的都是大量的数据,而且是一行行的那种,大部分数据也不太用的到,所以这个时候用串口DMA空闲中断其实就意义不大,这样我们就可以用一种新的思路来进行数据解析,专门针对这样的数据!!! 1、ATGM336H模块介绍 这里我用的大概长这样,还有很多其他版本的,不过区别不大,都差不多,可对照学习 参数说明: 参数 详情说明 波特率: 9600(默认),可用软件设置 可用卫星: GPS和北斗双模 输出协议: NMEA-

时时总结,常常分享 6525

深入解析GPS导航系统源代码及应用

全球定位系统(Global Positioning System,简称GPS)最初由美国开发,目的是提供全球范围内的精确位置、速度和时间信息。自1978年第一颗GPS卫星发射以来,GPS技术经历了从军事到民用的转变,并迅速成为现代导航技术的基石。GPS导航技术依赖于精确的卫星信号来确定地球上任何位置的用户设备的坐标。卫星发出的信号包含了时间戳和卫星位置信息,接收器通过计算信号的传播时间来确定与卫星之间的距离,通过多颗卫星的数据,可以计算出接收器的精确位置。

weixin_42124497的博客 562

GPS NMEA协议

nmea数据如下:$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04$GPGGA,1

放牛娃的专栏 7479

精通GPS数据分析与应用

全球定位系统(GPS)技术在多个行业中发挥着至关重要的作用。从物流、农业到军事应用,精确的定位数据帮助优化操作流程,提高效率。这一章节旨在为读者提供对GPS数据分析基础知识的全面了解,并概述它在现代IT和相关领域中应用的重要性。GPS.c源文件是GPS数据分析中最为关键的部分,该文件主要负责处理GPS模块接收到的原始数据。主要功能模块包括信号捕获、跟踪、解码、导航电文处理、坐标转换等。这些模块共同协作,最终实现从卫星信号中提取位置信息的目的。

weixin_32324637的博客 1459

UBLOX GPS模块C/C++编程实战教程

本文还有配套的精品资源,点击获取 简介:本资源包聚焦于UBLOX GPS模块的C/C++编程,旨在通过驱动程序和示例代码帮助开发者掌握与UBLOX第4代或第5代GPS模块的交互技术。资源包含适用于AT91RM9200微处理器的代码,使用串行通信和中断处理机制来实时处理GPS数据。代码的模块化和平台无关设计使其易于移植至不同硬件平台。开发者通过阅读源代码文件"UBLOX_GP...

weixin_36289813的博客 1919

终极免费GPS数据解析神器Minmea完整使用指南

你是否曾经在开发嵌入式项目时,为GPS数据的解析而烦恼?面对NMEA 0183协议复杂的句子结构,是否感到无从下手?别担心,今天我要为你介绍一款轻量级的GPS数据解析神器——Minmea,它能让你在资源受限的设备上轻松处理GPS定位信息! ## 为什么选择Minmea解析GPS数据 Minmea作为一款纯C语言编写的GPS NMEA 0183解析库,专门为嵌入式系统和微控制器设计。它具有以下几

gitblog_00446的博客 497

基于Qt框架的GPS应用开发教程

Qt是一个跨平台的C++应用程序框架,广泛用于开发图形用户界面程序以及非GUI程序。它为开发者提供了一整套工具和库,用于创建具有高级图形、声音、网络等特性的应用程序。Qt以其优良的设计和强大的跨平台能力闻名,支持在多种操作系统上运行,如Windows、macOS、Linux、嵌入式系统等。通过Qt,开发者能够用一套代码库构建出兼容多种操作系统的应用程序,极大提高了开发效率和软件的可移植性。在跨平台开发中,Qt框架的优势体现在以下几个方面:统一的API。

weixin_32306683的博客 1281

基于FL2440的GPS模块开发

1、GPS简介 全球定位系统(Global Positioning System,通常简称GPS)是一个中距离圆型轨道卫星导航系统。它可以为地球表面绝大部分地区(98%)提供准确的定位、测速和高精度的时间标准。系统由美国国防部研制和维护,可满足位于全球任何地方或近地空间的军事用户连续精确的确定三维位置、三维运动和时间的需要。该系统包括太空中的24颗GPS卫星;地面上的1个主控站、3个数据注入

我们的征途是星辰大海 540

PC版GPS数据查看工具:GPS Viewer使用体验

在数字化时代,地理位置信息(GIS)技术的应用变得无处不在,而全球定位系统(GPS)是获取地理信息的关键工具。本章将为读者提供一个全面的概览,介绍在Windows平台上使用GPS查看工具的重要性、应用场景以及优势。GPS查看工具是应用程序或软件,它们能够连接到GPS设备,实时读取并解析地理位置数据。这些工具对于需要追踪位置信息的专业领域来说至关重要,比如物流、地理信息系统(GIS)、户外探险等领域。它们帮助用户监控、分析甚至改善路线规划。

weixin_35972981的博客 1473

运用AD进行stm32最小系统PCB图的绘制

运用AD进行stm32最小系统PCB图的绘制一、PCB图的绘制(1)布局(2)布线(3)覆铜(4)电气规则检查二、给PCB添加logo三、生成garber文件总结 一、PCB图的绘制 (1)布局 1.画好原理图后,新建一个PCB项目 2.在Design中选择第二项,导入器件 3.先点击右下角第一项,再点第二项导入器件 导入成功 4.导入后效果 选择紫红色方框,按电脑上的delete键把它删掉 5.在Tools选择Outside Board,自动排布器件 排布后效果如图 6.画线,确定板子范围

lucario1的博客 2149
上一篇: GPSTK 数据配置文件格式
下一篇: rtklib使用kalman滤波进行高精度相对定位原理
Whoisbug
博客等级 码龄9年 894粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值