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

    文章

    2735

    浏览量

    164073
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124102

原文标题:GPS nmealib学习笔记

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

收藏 人收藏

    评论

    相关推荐

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

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

    PADS制造准备缩短周期时间

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

    关于GPS解析函数的问题

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

    有什么方法可以缩短测试仪器开发时间吗?

    有什么方法可以缩短仪器开发时间,以便测试仪器能够满足新的测量需求吗?采用SDR技术一类的应用往往具有共同的特征
    发表于 04-09 06:28

    GPS的相关资料下载

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

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

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

    采用全新嵌入式软件测试解决方案,有效缩短开发周期并节约成本

    在目前的嵌入式产品开发中,多核处理器的采用以及不断增长的产品复杂度的需求让软件设计和测试的任务不断加重,而厂商又面临着提高产品上市速度(time-to-market)的压力,缩短开发测试周期
    发表于 12-04 14:39 161次阅读

    三星电子推出新款图像传感器ISOCELL 缩短中端智能手机开发周期有望

    三星电子今日宣布推出ISOCELL即插即用解决方案,采用新款图像传感器ISOCELL 薄 3P9,有望缩短中端智能手机摄像图模组的开发周期
    的头像 发表于 05-22 15:12 3869次阅读

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

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

    Vishay宣布将缩短MLCC供货周期

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

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

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

    STM32:GPS解析

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

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

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

    产品线工程(PLE)解决方案可缩短开发周期

    随着新四化以及软件定义汽车的发展,汽车产品呈现出系统复杂且多样化的特点。如何应对日益增长的复杂性,并且实现系统级工程资产重用成为了重要的挑战。产品线工程(PLE)解决方案可缩短开发周期,快速响应市场变化,快速复用资产,并且集中管
    的头像 发表于 02-10 18:18 1928次阅读

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

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