0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

nmealib的使用可以缩短GPS的开发周期

单片机爱好者 2018-01-25 15:12 次阅读

程序员Tim 提供了一个非常完善的NMEA解码库,直接使用该解码库,可以避免重复发明轮子的工作。在野火提供的GPS模块资料的“NMEA0183解码库源码”文件夹中也包含了该解码库的源码,野火提供的STM32程序就是使用该库来解码NMEA语句的。

该解码库目前最新为0.5.3版本,它使用纯C语言编写,支持windows、winCE 、UNIX平台,支持解析GPGGA,GPGSA,GPGSV,GPRMC,GPVTG这五种语句(这五种语句已经提供足够多的GPS信息),解析得的GPS数据信息以结构体存储,附加了地理学相关功能,可支持导航等数据工作,除了解析NMEA语句,它还可以根据随机数产生NMEA语句,方便模拟。

0.nmealib简介

nmealib是一个基于C语言的用于nmea协议的开源库。虽然nmea体积小巧,但是却具备了不少功能。

分析NMEA语句并把结果保存在合适的C语言结构体中。

除了解析NMEA语句之外,还可以产生NMEA语句。

支持多种NMEA语句,包括GPGGA, GPGSA, GPGSV, GPRMC, GPVTG。

解析算法层次严谨。

附加地理学相关功能,可支持导航等数据工作。

1.目录介绍

nmealib的目录还是非常清晰的,下面简单介绍一下。

include\nmealib文件夹中存在nmealib相关的头文件

src文件夹存放nmealib相关源文件,该文件夹中的内容和include\nmealib文件夹相对应

samples文件夹存放若干例子,一些简单易懂的例子。

2.示例代码

[cpp]view plaincopy

#include

#include

#include

intmain()

{

//被测试的GPS模块输出数据,仅有GPRMC格式

chargps_str[]="$GPRMC,013257.00,A,3129.51829,N,12022.10562,E,0.093,,270813,,,A*7A\r\n";

nmeaINFOinfo;//nmea协议解析结果结构体

nmeaPARSERparser;//nmea协议解析载体

nmea_zero_INFO(&info);//填入默认的解析结果

nmea_parser_init(&parser);//为解析载体分配内存空间

//调用函数完成GPS信息解析,最终结果保留于info数组中

if((nmea_parse(&parser,gps_str,(int)strlen(gps_str),&info))>0)

{

printf("longitude%.5f\r\n",info.lon);

printf("latitude%.5f\r\n",info.lat);

printf("speed%.2f\r\n",info.speed);

}

nmea_parser_destroy(&parser);//释放解析载体的内存空间

return0;

}

nmealib的使用可以缩短GPS的开发周期

图1 程序输出结果

利用nmealib解析GPS模块的输出结果大致可以分为三步,第一步定义和初始化GPS信息结构体和解析载体结构体,第二步调用nmea_parse函数完成解析工作,第三步释放解析载体所占用的内存空间。如果仔细查看nmea_parser_init部分的代码,便会发现函数中使用了C标准库的malloc函数,该函数会在RAM中的heap空间开辟一个空间,这就需要使用完该载体之后立刻释放,所以nmea_parser_init和nmea_parser_destroy需要成对出现。

[cpp]view plaincopy

typedefstruct_nmeaINFO

{

intsmask;/**< Mask specifying types of packages from which data have been obtained */  

nmeaTIMEutc;/**< UTC of position */  

intsig;/**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */  

intfix;/**< Operating mode, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */  

doublePDOP;/**< Position Dilution Of Precision */  

doubleHDOP;/**< Horizontal Dilution Of Precision */  

doubleVDOP;/**< Vertical Dilution Of Precision */  

doublelat;/**< Latitude in NDEG - +/-[degree][min].[sec/60] */  

doublelon;/**< Longitude in NDEG - +/-[degree][min].[sec/60] */  

doubleelv;/**< Antenna altitude above/below mean sea level (geoid) in meters */  

doublespeed;/**< Speed over the ground in kilometers/hour */  

doubledirection;/**< Track angle in degrees True */  

doubledeclination;/**< Magnetic variation degrees (Easterly var. subtracts from true course) */  

nmeaSATINFOsatinfo;/**< Satellites information */  

}nmeaINFO;

nmeaINFO是一个很关键的结构体,该结构体中保存了nmea语句解析的结果。例如lat代表纬度,lon代表精度,speed代表速度。需要注意的是lat和lon的数值格式和百度地图的格式是有区别,而速度的单位为KM/H,相对于“节”这个单位,公里每小时要好理解的多。

GPS模块可以输出的内容很多,但是最基本的信息可通过GPRMC获得。GPRMC的具体格式如下内容所示:

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh

<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式

<2> 定位状态,A=有效定位,V=无效定位

<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)

<4> 纬度半球N(北半球)或S(南半球)

<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)

<6> 经度半球E(东经)或W(西经)

<7> 地面速率(000.0~999.9节,前面的0也将被传输)

<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)

<9> UTC日期,ddmmyy(日月年)格式

<10> 磁偏角(000.0~180.0度,前面的0也将被传输)

<11> 磁偏角方向,E(东)或W(西)

<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

在不同的情况下测试GPS模块,可以获得以下三种不同形式的输出内容:

1)$GPRMC,013257.00,A,3129.51829,N,12022.10562,E,0.093,,270813,,,A*7A\r\n

2)$GPRMC,022649.00,V,,,,,,,020913,,,N*7F\r\n

3)$GPRMC,,V,,,,,,,,,,N*53\r\n

【第一种】GPS定位成功,输出正确的GPS位置信息和对地速度信息。

【第二种】GPS定位异常,只有UTC时间信息,其中V代表定位错误。

【第三种】GPS定位异常,甚至没有UTC时间信息,其中V代表定位错误。

通过测试,nmealib处理第一种情况没有任何问题,但是连续处理第二种和第三种情况会产生问题,产生问题的主要原因是动态开辟的空间没有被释放。解决该问题需要修改nmealib的源代码。如果不想修改nmealib源代码,可以在串口接收GPS输出内容时直接过滤带有V的字符串,这种方法简单有效,同样可以获得准确的GPS坐标信息。

3.若干注意点

3.1 重置解析载体缓冲区

由于nmealib虽然使用C语言,但是相关测试环境均基于PC环境,所以在嵌入式环境下需要对相关参数(宏定义)进行修改。例如context.h文件中,定义了待处理的nmea缓冲区的大小,相关宏定义如下

#define NMEA_DEF_PARSEBUFF (1024)

#define NMEA_MIN_PARSEBUFF (256)

示例代码的分析中提到,解析载体parser通过动态内存分配的方法开辟空间,该空间位于RAM空间中的heap部分,如果heap部分设置的太小,将会导致MCU进入不可预知的状态或者直接掉入断言中。

在编译器设置中,option->linker,cstack和heap的大小设置如下图所示,此时heap的大小仅有512个字节,而解析载体却需要1024个字节,那么分配内存时势必会产生问题,而工程的编译却不会有任何问题。

图2 不合适的HEAP大小设置

[cpp]view plaincopy

if(0==(parser->buffer=malloc(buff_size)))

nmea_error("Insufficientmemory!");//此时会发生内存分配错误

else

{

parser->buff_size=buff_size;

resv=1;

}

在这种情况下可以适当减少缓冲区的大小,例如修改如下:

#define NMEA_DEF_PARSEBUFF (256)

#define NMEA_MIN_PARSEBUFF (128)

同时可以把HEAP空间大小的调整一下。

图3 合适的HEAP大小设置

当然缓冲区的大小也是视情况而定,若GPS模块仅输出GPRMC语句,那么256字节的缓冲区已经足够了。但是如果GPS模块输出GPGGA, GPGSA, GPGSV, GPRMC, GPVTG等多种数据,那么256字节的缓冲区也有可能不够使用。

3.2 注意nmeaINFO结构体大小

nmeaINFO结构体左右360字节,若该结构体类型的变量势必会占用较多的CSTACK(全局变量的情况除外),在嵌入式编程中像nmeaINFO类型的变量也可算的上是中型“人物”了。所以在调试的过程中可以打开IDE的stack查看功能(进入debug模式,view->stack),观察当前函数的CSTACK使用情况,尤其要注意CSTACK越界的情况。

nmealib的使用可以缩短GPS的开发周期

图4 查看CSTACK空间占用情况

从上图可以看出,CSTACK的大小为2048字节(2K),此时被占用752字节,占用率为36%,完全在可以接受的范围内。

4.总结

nmealib的使用可以缩短GPS的开发周期,这里只是简单的举例了nmealib的基本功能,更多的功能可以查看samples文件夹中的例子,并在实践中不断熟悉提高。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gps
    gps
    +关注

    关注

    22

    文章

    2882

    浏览量

    165978
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136054

原文标题:GPS nmealib学习笔记

文章出处:【微信号:gh_dae0718828df,微信公众号:gh_dae0718828df】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    缩短开发周期,充电仓SoC的多合一趋势

    耳机充电仓既能为耳机增加续航,还起到了很好的收纳作用。在TWS耳机百亿级的市场规模驱使下,准入门槛较低、开发周期缩短的充电仓SoC迎来了需求的爆发。   英集芯“多合一”TWS充电仓SoC   在电源管理、电池管理、无线信号处理
    的头像 发表于 02-07 19:12 2519次阅读

    PADS制造准备缩短周期时间

    PADS 制造准备可帮助您优化产品质量,缩短周期时间和节省成本。
    发表于 05-06 11:01

    关于GPS解析函数的问题

    GPS解析函数nmea_decode_test(void),使用NUCLEO-F411RE的串口6接收来自GPS的数据,并通过DMA的方式将数据从串口6传送到内存,然后调用nmealib库中的解析
    发表于 06-03 15:57

    GPS的相关资料下载

    进行显示。这里分别介绍2中解析协议的方法,第一种就是自己写解析协议函数,第二种便是采用别人写好的GPS解析协议库:NMEALIB库,将这个库移植到M3中,直接调用API函数,就可以解析出GPS
    发表于 02-08 07:37

    基于FPGA的GPS模块和电子罗盘模块驱动设计

    GPS和电子罗盘是定位系统的重要组成部分。在实际应用中通常采用定制的GPS模块和电子罗盘模块,以简化产品设计和缩短设计周期。但是采用DSP直接控制它们效率较低且费时,必将拖累
    发表于 10-25 16:54 203次下载
    基于FPGA的<b class='flag-5'>GPS</b>模块和电子罗盘模块驱动设计

    基于GPS轨迹的周期模式发现

    针对周期行为挖掘中面临的时空数据采样频率不确定,数据稀疏,时空数据噪声等问题,本文采用GMPF (GPS Multi-Periodic Find) 算法来检测用户的周期模式。该算法首先将用户的轨迹
    发表于 01-04 15:02 0次下载

    如何快速在AWorks OS操作系统中开发并稳定应用GPS模块

    物联智能时代,GPS定位应用愈发广泛,如何快速应用GPS定位模块,稳定有效的获取定位信息,缩短项目周期是至关重要的。
    的头像 发表于 07-10 08:59 3180次阅读

    Vishay宣布将缩短MLCC供货周期

    Vishay宣布,为了兑现公司支持多层陶瓷片式电容器(MLCC)客户的承诺,宣布缩短MLCC供货周期
    发表于 07-15 15:37 944次阅读

    物联网参考设计开发人员如何缩短设计周期

    满足对速度的需求Ignion的开发环境也有助于物联网参考设计人员、开发人员和最终的制造商缩短其设计周期。借助于Ignion的技术,从数千种潜在可用的、彼此不同的天线中找到合适选项的过程
    的头像 发表于 11-01 10:14 2282次阅读

    STM32:GPS解析

    进行显示。这里分别介绍2中解析协议的方法,第一种就是自己写解析协议函数,第二种便是采用别人写好的GPS解析协议库:NMEALIB库,将这个库移植到M3中,直接调用API函数,就可以解析出GPS
    发表于 12-04 20:36 41次下载
    STM32:<b class='flag-5'>GPS</b>解析

    2.4寸微波炉旋钮屏极大缩短了用户的产品开发周期

    编码旋钮方案,结构紧凑、简单,外观精致;支持WIFI,用户可以通过对扩展接口进行串口通讯、按键、usb摄像头等功能的开发调试,极大缩短用户产品开发
    发表于 01-14 15:12 1043次阅读
    2.4寸微波炉旋钮屏极大<b class='flag-5'>缩短</b>了用户的产品<b class='flag-5'>开发</b><b class='flag-5'>周期</b>

    ​高效开发 | 开发周期可比同行业缩短60%,LuatOS公网对讲机方案

    可以使用。公网对讲机以其便利性以及覆盖广、成本低等特性,广泛应用于物流、物业、工地、酒店、学校及工厂等领域。合宙LuatOS公网对讲机方案,开发周期可比同行业缩短
    的头像 发表于 11-18 11:41 2213次阅读
    ​高效<b class='flag-5'>开发</b> | <b class='flag-5'>开发</b><b class='flag-5'>周期</b>可比同行业<b class='flag-5'>缩短</b>60%,LuatOS公网对讲机方案

    英伟达大幅缩短AI GPU交付周期

    根据瑞银分析师最近提供给投资者的备忘录,英伟达已经显著缩短了其AI GPU的交付周期。这一周期已经从去年年底的8-11个月迅速缩短至目前的3-4个月。这一变化引发了市场的广泛关注,分析
    的头像 发表于 02-18 17:31 808次阅读

    Arm宣布推出全新汽车技术,可缩短多达两年的人工智能汽车开发周期

    Arm 携手生态伙伴推出了最新的 Arm 汽车增强 (AE) 处理器和虚拟平台,让汽车行业在开发伊始便可应用,助力缩短多达两年的开发周期
    的头像 发表于 03-14 12:17 899次阅读

    Arm推出汽车增强处理器及虚拟平台,缩短人工智能汽车开发周期

    近日,全球领先的半导体和基础设施软件设计公司Arm控股有限公司(纳斯达克股票代码:ARM,简称“Arm”)与合作伙伴共同推出了最新的Arm汽车增强(AE)处理器和虚拟平台。这一创新解决方案旨在让汽车行业在开发初期即可应用,有望大幅缩短多达两年的
    的头像 发表于 03-28 10:46 511次阅读