0.nmealib简介nmealib是一个基于C语言的用于nmea协议的开源库。虽然nmea体积小巧,但是却具备了不少功能。分析NMEA语句并把结果保存在合适的C语言结构体中。除了解析NMEA语句之外,还可以产生NMEA语句。支持多种NMEA语句,包括GPGGA, GPGSA, GPGSV, GPRMC, GPVTG。解析算法层次严谨。附加地理学相关功能,可支持导航等数据工作。更多介绍请参考以下链接http://nmea.sourceforge.net/#downloads1.目录介绍nmealib的目录还是非常清晰的,下面简单介绍一下。include\nmealib文件夹中存在nmealib相关的头文件src文件夹存放nmealib相关源文件,该文件夹中的内容和include\nmealib文件夹相对应samples文件夹存放若干例子,一些简单易懂的例子。

#include <nmea/nmea.h>
#include <string.h>
#include <stdio.h>int main()
{// 被测试的GPS模块输出数据,仅有GPRMC格式char gps_str[] = "$GPRMC,013257.00,A,3129.51829,N,12022.10562,E,0.093,,270813,,,A*7A\r\n";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\r\n",info.lon);printf("latitude    %.5f\r\n",info.lat);printf("speed       %.2f\r\n",info.speed);}nmea_parser_destroy(&parser);   // 释放解析载体的内存空间return 0;
}

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

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个字节,那么分配内存时势必会产生问题,而工程的编译却不会有任何问题。

4.总结

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

c语言 GPS nmealib学习笔记相关推荐

  1. GPS nmealib学习笔记

    GPS nmealib学习笔记 标签: GPSnmealibCSTACKHEAP 2013-10-17 11:12 4274人阅读 评论(7) 收藏 举报  分类: 嵌入式ARM(24)  版权声明: ...

  2. nmealib linux编译,GPS nmealib学习笔记

    0.nmealib简介nmealib是一个基于C语言的用于nmea协议的开源库.虽然nmea体积小巧,但是却具备了不少功能.分析NMEA语句并把结果保存在合适的C语言结构体中.除了解析NMEA语句之外 ...

  3. GPS nmealib学习笔记 .

    from:http://blog.csdn.net/xukai871105/article/details/12834421 0.nmealib简介     nmealib是一个基于C语言的用于nme ...

  4. 语言 提取列名_学习健明老师发布的R语言练习题的学习笔记(二)

    学习者:骆栢维 题目来源:生信基石之R语言 中级10 个题目:http://www.bio-info-trainee.com/3750.html 备注:本文为笔者学习健明老师GitHub答案代码的学习 ...

  5. 《Go语言圣经》学习笔记 第十一章 测试

    <Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...

  6. 《Go语言圣经》学习笔记 第十章 包和工具

    <Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...

  7. 《Go语言圣经》学习笔记 第九章 基于共享变量的并发

    <Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...

  8. 《Go语言圣经》学习笔记 第八章 Groroutines和Channels

    <Go语言圣经>学习笔记 第八章 Groroutines和Channels 目录 Goroutines 实例:并发的Clock服务 实例:并发的Echo服务 Channels 并发的循环 ...

  9. 《Go语言圣经》学习笔记 第六章 方法

    <Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...

最新文章

  1. 马斯克嘲笑「元宇宙」的想法,并给年轻人5条鸡汤
  2. Manacher算法 , 实例 详解 . NYOJ 最长回文
  3. python3.7.2怎么安装和管理扩展包_怎么安装python扩展包管理工具pip
  4. 如何在ashx页面获取Session值
  5. 这本免费小书,带你征服 GitHub!
  6. linux客户端无法绑定端口号,为什么Linux客户端的情况下不支持端口共用?
  7. 360多数据源混合查询引擎的前世今生
  8. Entity Framework 4 in Action 读书笔记——开篇
  9. 创建一个JFrame,可下拉选择显示字符串和图片
  10. 气温常年在25度的地方_25度是什么气候
  11. JAVA编写的一个简单的Socket实现的HTTP响应服务器
  12. *第十一周*数据结构实践项目一【二叉树的层次遍历算法】
  13. js:防抖动与节流【转载】
  14. 简单、快捷、低成本的超写实虚拟人平台来了……
  15. Django面试题库
  16. 【蚂蚁链学习1】初识蚂蚁链的智能合约(solidity)
  17. vue项目打包 发现首页打不开或空白页面
  18. spanning-tree Protocol 简称STP,生成树协议,被广泛部署在二层交换网络中,用于防止网络出现环路,同时增加网络的冗余性
  19. Java项目:学生综合素质评价系统(java+SSM+thymeleaf+layui+Mysql)
  20. 基于python的QQ第三方登陆实现工具类

热门文章

  1. [C# VSTO Word]word中段落回车符到底是什么?来看看它的真面目,是否和你想象的一样?
  2. 基于gensim的Deep learning with paragraph2vec 官方models.doc2vec文档解释
  3. 嘉洋独家观点:关于近期股市的详解
  4. 微软最走运/倒霉的十个瞬间
  5. 网络原理之TCP/IP协议
  6. 手机屏幕测试html5,一加手机5屏幕测试:色彩素质优秀,唯独分辨率是美中不足...
  7. Linux系统的时间管理及优化
  8. 分屏演示PPT,你可同时看见幻灯片备注信息
  9. https安全证书提示证书风险怎么办
  10. 【进阶四】Python实现(MD)HVRP常见求解算法——蚁群算法(ACO)