本文转自 iYouth博文

http://www.cnblogs.com/pingwen/p/5225461.html

【正文部分】

受朋友所托,调试一款GPS模块,该模块是UBLOX的NEO-6M GPS模组。想到用这款GPS的人较多,自己日后也有可能在用到这个模块,就写下这份笔记。

1. 介绍

基本信息如下:

1, 模块采用U-BLOX NEO-6M模组,体积小巧,性能优异。

2, 模块增加放大电路,有利于无缘陶瓷天线快速搜星。

3, 模块可通过串口进行各种参数设置,并可保存在EEPROM,使用方便。

4, 模块自带SMA接口,可以连接各种有源天线,适应能力强。

5, 模块兼容3.3V/5V电平,方便连接各种单片机系统。

6, 模块自带可充电后备电池,可以掉电保持星历数据。

看到这里,就可以知道,这个模块是高度集成的,有点类似于西门子华为等公司的GPRS模块,基本上就是一个小的系统,用户只需要用AT命令通过串口通信就可以完成所有工作。那么这款模块的使用,其实就是字符串的解析工作了。

2. 通信协议

GPS模块采用NMEA 0183协议,NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式。目前业已成了GPS导航设备统一的RTCM(Radio Technical Commission for Maritime services)标准协议。

NMEA-0183协议采用ASCII码来传递GPS定位信息,我们称之为帧。

帧格式形如:$aaccc,ddd,ddd,„,ddd*hh(CR)(LF)

1、“$”:帧命令起始位

2、aaccc:地址域,前两位为识别符(aa),后三位为语句名(ccc)

3、ddd„ddd:数据

4、“*”:校验和前缀(也可以作为语句数据结束的标志)

5、hh:校验和,$与*之间所有字符ASCII码的校验和(各字节做异或运算,得到

校验和后,再转换16进制格式的ASCII字符)

6、(CR)(LF):帧结束,回车和换行符

在一般的项目中,最常用的指令是第4个,即GPRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data),$GPRMC语句的基本格式如下:

$GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF)

(1) UTC时间,hhmmss(时分秒)

(2) 定位状态,A=有效定位,V=无效定位

(3) 纬度ddmm.mmmmm(度分)

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

(5) 经度dddmm.mmmmm(度分)

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

(7) 地面速率(000.0~999.9节)

(8) 地面航向(000.0~359.9度,以真北方为参考基准)

(9) UTC日期,ddmmyy(日月年)

(10)磁偏角(000.0~180.0度,前导位数不足则补0)

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

(12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效)

举例如下:

$GPRMC,023543.00,A,2308.28715,N,11322.09875,E,0.195,,240213,,,A*78

3. PC端显示数据

GPS模块有一个PC配置软件,叫做u-Center,可以对模块进行参数设置,然后保存到EEPROM,其实也可以通过单片机串口通信进行设置,但是PC端设置更加人性化,可以立刻看到结果。

打开GPS模块之后,接上u-Center软件,可以看到如下数据。

$GPGSV,2,2,08,21,15,076,,23,52,270,,26,50,050,,27,52,179,*7D

$GPRMC,132043.00,V,,,,,,,120116,,,N*7F

$GPVTG,,,,,,,,,N*30

$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30

$GPGSV,2,1,08,03,00,230,,07,02,301,,08,24,198,,16,72,000,*7B

$GPGSV,2,2,08,21,15,076,,23,52,270,,26,50,050,,27,52,179,*7D

$GPRMC,132044.00,V,,,,,,,120116,,,N*78

$GPVTG,,,,,,,,,N*30

$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30

$GPGSV,2,1,08,03,00,230,,07,02,301,,08,24,198,,16,72,000,*7B

$GPGSV,2,2,08,21,15,076,,23,52,270,25,26,50,050,,27,52,179,*7A

$GPRMC,132045.00,V,,,,,,,120116,,,N*79

$GPVTG,,,,,,,,,N*30

$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30

$GPGSV,2,1,08,03,00,230,,07,02,301,,08,24,198,,16,72,000,*7B

$GPGSV,2,2,08,21,15,076,,23,52,270,,26,50,050,,27,52,179,*7D

$GPRMC,132046.00,V,,,,,,,120116,,,N*7A

$GPVTG,,,,,,,,,N*30

$GPGSV,2,1,08,03,00,230,,07,02,301,,08,24,198,,16,72,000,*7B

$GPGSV,2,2,08,21,15,076,07,23,52,270,20,26,50,050,,27,52,179,*78

$GPRMC,132049.00,V,,,,,,,120116,,,N*75

$GPRMC,133300.00,V,,,,,,,120116,,,N*7A

$GPRMC,133301.00,V,,,,,,,120116,,,N*7B

$GPRMC,133302.00,V,,,,,,,120116,,,N*78

$GPRMC,133303.00,V,,,,,,,120116,,,N*79

$GPRMC,133304.00,V,,,,,,,120116,,,N*7E

$GPRMC,133305.00,V,,,,,,,120116,,,N*7F

$GPRMC,133306.00,A,3949.63075,N,11616.48616,E,0.513,,120116,,,A*7A

$GPRMC,133307.00,A,3949.63025,N,11616.48614,E,1.053,,120116,,,A*7C

$GPRMC,133308.00,A,3949.63002,N,11616.48641,E,1.101,,120116,,,A*70

…………

4. PC端软件配置

GPS有7种指令数据输出,如果我们只需要当前经纬度的话,可以屏蔽其他的数据。如果不屏蔽的话,MCU处理的时候,会不停的收到不需要的指令,降低MCU效率。

使用软件配置,[Config]-->[Configuration], 可以选择显示哪些项目,这里只保留GPRMC指令信息输出,然后保存。界面显示如下:

5. 数据解析

相对于MCU的处理速度,GPS定位数据更新几乎可以认为是缓慢变化的信号,每秒都会输出推荐位置信息,但是即使丢掉几个也不会影响定位准确性。因此可以使用中断循环buffer来接收GPS输出的串口数据,然后在需要的地方读取buffer,对数据实现一次检索,找到一个有用的GPS定位数据。

因为实际收到的数据有不完整的,或者无效的定位信息,也有串口接收循环buffer造成的覆盖数据,因此上面还校验了数据长度,以及一个标志字符串到另一个字符串直接的长度。上面处理的基本思想是:找到"$GPRMC,"帧头,然后找到代表定位信息有效的字符",A,",最后找到帧尾",A*"。

实际使用中,发现没有加上校验也可以很有效的工作,但是为了保证数据安全,最后的异或校验还有应该有的。

/*******************************************************************************

* Function Name  :

* Description    : 对GPRMC数据包进行解析,找到经纬度数据

* Input          :

* Output         :

* Return         :

*******************************************************************************/

uint8_t read_gps_data(uint8_t *gps_buf, uint8_t frame_len, uint8_t *weidu, uint8_t *jindu)

{

uint8_t *weidu_s = NULL;

uint8_t *weidu_o = NULL;

uint8_t *jingdu_o = NULL;

uint8_t rtn =0;

//GPRMC,133735.00,A,3949.63893,N,11616.48419,E,0.296,,120116,,,A*79

weidu_s  = strstr(GPS_Frame_Buf, ",A,");

weidu_o  = strstr(GPS_Frame_Buf, ",N,");

jingdu_o = strstr(GPS_Frame_Buf, ",E,");

if((weidu_s == NULL) || (weidu_o == NULL) ||(jingdu_o == NULL) )

{

rtn = FALSE;

}

else

{

memset(weidu_buf,0,sizeof(weidu_buf));

memset(jindu_buf,0,sizeof(jindu_buf));

memcpy(weidu_buf, weidu_s+3, (weidu_o-weidu_s-3));

memcpy(jindu_buf, weidu_o+3, (jingdu_o-weidu_o-3));

printf("rn---------------------------------------");

printf("rnGet GPS Frame:rn%srn", GPS_Frame_Buf);

printf("rn---------------------------------------");

rtn = TRUE;

}

return rtn;

}

6. 总结

本文总结了GPS模块的基本使用方法,可以得到经度和纬度信息。对于此类的模块产品,主要工作有两大部分:

1:模块的熟悉,包括配置和指令的使用,一般可以一边读文档一边跑下demo体验效果;

2:字符串的解析。

同样的经验可以应用于很多串口模块。

例如GPRS模块,蓝牙模块,zigbee模块,TCP模块,CAN模块,485模块。

这几种产品我都使用过,其基本思路是一样的,调试时候可以先用串口助手模拟MCU来发数据,其实大部分模块都有自己的PC端工具,可以很快的看到效果。

使用模块可以极大地提升项目效率,但是灵活性和成本上会有所牺牲。另外,由于模块的封闭性,一般都要写很多的异常保护处理来保证产品的正常工作。

U-BLOX GPS 模块及GPRMC指令解析相关推荐

  1. 泰斗 GPS模块调试(1)

    泰斗 GPS :https://topsemic.com/wp-content/uploads/2019/02/GPS模块使用经验分享.pdf GPS+北斗 N303双模导航定位模块用户手册 http ...

  2. Android 驱动和系统开发 2. 解析模拟器GPS模块 (原创)

    好久没有写技术博客了,恰逢今天还感冒了,这破天气,晚上凉风一吹,就感冒了,要加强锻炼呀. 好了,废话不多说,由于工作需要,我要移植一个虚拟的gps模块,于是乎,我就参考了Android模拟器的gps模 ...

  3. Android 驱动和系统开发 2. 解析模拟器GPS模块

    好久没有写技术博客了,恰逢今天还感冒了,这破天气,晚上凉风一吹,就感冒了,要加强锻炼呀. 好了,废话不多说,由于工作需要,我要移植一个虚拟的gps模块,于是乎,我就参考了android模拟器的gps模 ...

  4. ROS实现串口GPS数据的解析与通信(这篇文章所用的代码和我买的带有ROS功能包的GPS模块的功能包的代码一样)

    我发现这篇文章所用的代码和我买的带有ROS功能包的GPS模块的功能包的代码一样!!! https://gitee.com/maxibooksiyi/gps_driver 转载自:https://blo ...

  5. 关于GPS模块数据解析-无名科创GPS模块

    由于在室外挂飞,发现UBLX始终无法接收到通过有效数据.所以安排了静态实验,再次查看GPS模块本身的好坏. 如下图所示,在朝室外0.5m距离的时候,通过u-center,设定波特率38400,接收到了 ...

  6. Python学习:利用python解析GPS模块数据,并生成可视化地图显示

    一.GPS模块数据格式 笔者在项目中使用过移远L76K以及梦芯MXT905HM两款GPS定位芯片,两款芯片均是采用串口输出数据,而且数据包采用的是NEMA协议消息结构,消息结构如下: 数据包格式如下: ...

  7. 【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】

    中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程 简介 准备工作 PC端需要用到的工具 代码下载地址 GD32F103C8T6最小系统板 代码实现 GD32串口引脚定义如下: 串口的初始化 ...

  8. 串口通信学习(GPS模块)2021.5.10

    GPS串口通信学习实践 2021.5.10 1.串口通信简介 1.1 波特率 1.2 数据位 1.3 停止位 1.4 奇偶校验位 2.GPS模块串口通信配置 2.1 驱动安装 2.2 插入GPS模块 ...

  9. GPS模块HAL层分析和调试

    主控: Samsung   Cortex  ARM A8  smdkc110  1G Gps:    Ublox-G6010 系统:  android 2.3 在android里关于普通GPS模块(俗 ...

  10. stm32与GPS模块的数据传输,最后把数据传回到电脑上

    stm32与GPS模块的数据传输,最后把数据传回到电脑上 准备工作 GPS(G28Z2FTTL)模块介绍 GPS数据类型及格式 代码部分 串口初始化部分 GPS部分代码 数据展示 准备工作 stm32 ...

最新文章

  1. 再学 GDI+[33]: TGPPen - 画笔的几何变换 - SetTransform
  2. 【Android】EditText的一个问题
  3. Linux accept tcp,Linux TCP accept without SYN|ACK
  4. 外媒称Windows 10是一辆“广告大巴车”
  5. vuejs 和 element 搭建的一个后台管理界面【收藏】
  6. spark KafkaRDD的理解
  7. phpstorm配置ftp,自动更新代码
  8. 2018年高教社杯全国大学生数学建模竞赛题目A题   高温作业专用服装设计
  9. XX系统性能测试报告模板
  10. 当我在荒废时间的时候会有多少人在拼命
  11. high charts柱状图更新(将原有柱状图更换为其他柱状图)删除重新绘制,柱状图设置渐变色
  12. 开放式激光振镜运动控制器:C++振镜矫正方法与实现
  13. 计算机指令包括哪2部分,机器指令分为哪几部分
  14. 为什么《请回答1988》能被称为神剧
  15. AliOS Things 网络适配框架 - SAL
  16. Android移动应用开发
  17. JQuery点击按钮 数字递增递减
  18. 可能与不可能的边界:P/NP问题趣史
  19. 【ArcGIS微课1000例】0043:ArcGIS绘制国界线的3种方法
  20. RK3368 8.1 HDMI声音调节只有最大和最小两个等级

热门文章

  1. 和君商学院A6选拔赛
  2. 生成均匀分布次序统计量的伪随机数 生成删失伪随机样本
  3. 【SoDiaoEditor电子病历编辑器】阶段性更新--新增复选框、日期控件、表格排版支持等--B/S架构...
  4. python矩阵求每个元素平方矩阵
  5. 微信小程序 23 播放音乐页
  6. android WebView加载网页视频
  7. python 线性插值处理_详解Python实现线性插值法
  8. html博客音乐播放器代码大全,一款百度FLASH音乐播放器代码
  9. 嵌入式 Linux 入门(一、Linux 基本介绍及文件结构)
  10. Excel查看工作表有多少列