0.nmealib简介nmealib是一个基于C语言的用于nmea协议的开源库。虽然nmea体积小巧,但是却具备了不少功能。分析NMEA语句并把结果保存在合适的C语言结构体中。除了解析NMEA语句之外,还可以产生NMEA语句。支持多种NMEA语句,包括GPGGA, GPGSA, GPGSV, GPRMC, GPVTG。解析算法层次严谨。附加地理学相关功能,可支持导航等数据工作。更多介绍请参考以下链接

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

mealib文件夹中存在nmealib相关的头文件src文件夹存放nmealib相关源文件,该文件夹中的内容和include

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

2.示例代码#include #include #include int main()

{

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

char gps_str[] = "$GPRMC,013257.00,A,3129.51829,N,12022.10562,E,0.093,,270813,,,A*7A

";

nmeaINFO info; // nmea协议解析结果结构体

nmeaPARSER parser; // 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

",info.lon);

printf("latitude %.5f

",info.lat);

printf("speed %.2f

",info.speed);

}

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

return 0;

}

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

typedef struct _nmeaINFO

{

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

nmeaTIME utc; /**< UTC of position */

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

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

double PDOP; /**< Position Dilution Of Precision */

double HDOP; /**< Horizontal Dilution Of Precision */

double VDOP; /**< Vertical Dilution Of Precision */

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

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

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

double speed; /**< Speed over the ground in kilometers/hour */

double direction; /**< Track angle in degrees True */

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

nmeaSATINFO satinfo; /**< 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> 经度ffffdmm.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*7A2)    $GPRMC,022649.00,V,,,,,,,020913,,,N*7F3)    $GPRMC,,V,,,,,,,,,,N*53【第一种】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大小设置

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

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

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越界的情况。

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

4.总结nmealib的使用可以缩短GPS的开发周期,这里只是简单的举例了nmealib的基本功能,更多的功能可以查看samples文件夹中的例子,并在实践中不断熟悉提高。示例工程链接:【bitbucket】简要说明:IAR ARM 6.5 simulator最后感谢我的同事utopiaprince,我从他那里学到很多东西,也帮助我解决了很多“疑难杂症”。

nmealib linux编译,GPS nmealib学习笔记相关推荐

  1. arm cef3 linux 编译_【学习笔记】CEF Linux编译

    源码编译部分转载:https://bitbucket.org/chromiumembedded/cef/wiki/MasterBuildQuickStart#markdown-header-linux ...

  2. 九十分钟极速入门Linux——Linux Guide for Developments 学习笔记

    转载自: 九十分钟极速入门Linux--Linux Guide for Developments 学习笔记 http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA ...

  3. Linux C编程一站式学习笔记2

    Linux C编程一站式学习笔记 chap2 常量.变量和表达式 本书以C99为标准 一.继续hello world 加入更多注释的hello world 可以用ctrl+(shift)+v复制到vi ...

  4. 【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

    目录 1.在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节) 1.1 mail.c 1.2 mpu6050.h 1.3 mpu6050.c 1.4 Makefile 2.以外称i ...

  5. 《深入理解LINUX内存管理》学习笔记(一)

    引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读.阅读英文原版,可以很好的理解作者的思路.作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习, ...

  6. linux之awk命令学习笔记

    Linux之awk命令学习笔记 前言 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, ...

  7. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...

  8. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  9. 《鸟哥的Linux私房菜》学习笔记

    <鸟哥的Linux私房菜>学习笔记 这是一份学习<鸟哥的Linux私房菜>的学习笔记,记笔记的原则是,感觉平时可能会用到的 就记录的详细一些,感觉暂时用不上的,只需要知道要解决 ...

最新文章

  1. HTML解析原理概括(转载)
  2. 安卓开发之路-浅识Android
  3. hadoop(3)——yarn查看方式
  4. Angular self study 3 - data binding
  5. 10玩rust_C++工程师的Rust迁移之路(5)- 继承与组合 - 下
  6. 前端学习(3124):react-hello-react之批量传递props
  7. IIS AppCreate子目录的错误(0x80020006)
  8. springBoot配置,贴个图
  9. totolink服务器未响应,TOTOLINK路由器设置后无法上网问题的解决方法
  10. JavaScript - textarea 滚动至顶部或底部
  11. c语言程序设计辅导资料pdf,C语言程序设计辅导资料(修订版).pdf
  12. 【JavaWeb】Filter案例:登录验证、敏感词汇过滤
  13. 服务器 linux raid驱动,Dell PowerEdge R710服务器安装CentOS 5.5加载Raid卡驱动 | 系统运维...
  14. dm9000数据速率_STM32F103战舰DM9000的LWIP例程TCP速度慢,发送间隔太长
  15. 渗透之——SQLMap参数说明
  16. php怎么做地图源代码,php直播源码百度地图坐标拾取系统自定义页面
  17. 一插usb接口计算机就重启,电脑故障分析:主机一插USB设备就死机,故障原因令人很无语...
  18. “扫地机器人双子星”正在坠落之科沃斯
  19. 物体6D位姿估计方法总结
  20. 安卓Android基于百度云平台人脸识别学生考勤签到系统设计

热门文章

  1. 机原自检——第3章 平面机构的运动分析
  2. 逻辑回归(Logistic Regression):线性回归与逻辑回归的来龙去脉
  3. 白噪声校验matlab,白噪声的测试MATLAB程序.doc
  4. excel文档损坏打不开该如何修复呢?
  5. 《ClickHouse企业级应用:入门、进阶与实战》1 全面了解ClickHouse
  6. CISSP AIO7 学习笔记 - 第二章 资产安全 2.1-2.8小节 附送脑图
  7. BIOMOD2模型、MaxEnt模型物种分布模拟,生物多样性生境模拟,论文写作
  8. JS字符串过滤数字_过滤大写数字
  9. HTML+CSS美食静态网页设计——简单牛排美食餐饮(9个页面)公司网站模板企业网站实现
  10. hdu 3265 Posters