这几天忙里偷闲集中把GPS NMEA0183协议好好研究了一下,不仅整理了一份相对较完整的协议文本,并且编写了一个相对较完善的GPS协议解析程序。

上图是我所说的测试程序,已经可以获得定位数据及相关卫星信息。

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

序号

命令

说明

最大帧长

1

$GPGGA

全球定位数据

72

2

$GPGSA

卫星PRN数据

65

3

$GPGSV

卫星状态信息

210

4

$GPRMC

运输定位数据

70

5

$GPVTG

地面速度信息

34

6

$GPGLL

大地坐标信息

7

$GPZDA

UTC时间和日期

注:发送次序$PZDA、$GPGGA、$GPGLL、$GPVTG、$GPGSA、$GPGSV*3、$GPRMC

协议帧总说明:

该协议采用ASCII 码,其串行通信默认参数为:波特率=4800bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。

帧格式形如:$aaccc,ddd,ddd,…,ddd*hh<CR><LF>

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

2、aaccc--地址域,前两位为识别符,后三位为语句名

3、ddd…ddd—数据

4、“*”—校验和前缀

5、hh—校验和,$与*之间所有字符代码的校验和(各字节做异或运算,得到校验和后,再转换16进制格式的ASCII字符。)

6、<CR><LF>--帧结束,回车和换行

其中$GPRMC比较重要,下面略加介绍。

1、$GPRMC(Recommended Minimum Specific GPS/TRANSIT Data)

 

帧头

UTC时间

状态

纬度

北纬/南纬

经度

东经/西经

速度

$GPRMC

hhmmss.sss

A/V

ddmm.mmmm

N/S

dddmm.mmmm

E/W

方位角

UTC日期

磁偏角

磁偏角方向

模式

校验

回车换行

ddmmyy

000 - 180

E/W

A/D/E/N

*hh

CR+LF

格 式: $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

说 明:

字段 0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息

字段 1:UTC时间,hhmmss.sss格式

字段 2:状态,A=定位,V=未定位

字段 3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

字段 4:纬度N(北纬)或S(南纬)

字段 5:经度dddmm.mmmm,度分格式(前导位数不足则补0)

字段 6:经度E(东经)或W(西经)

字段 7:速度,节,Knots(一节也是1.852千米/小时)

字段 8:方位角,度(二维方向指向,相当于二维罗盘)

字段 9:UTC日期,DDMMYY格式

字段10:磁偏角,(000 - 180)度(前导位数不足则补0)

字段11:磁偏角方向,E=东,W=西

字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)

字段13:校验值

对应的程序代码如下:

//运输定位数据

  1. private bool GPRMC_Parse(string data)
  2. {
  3. string[] source = Split(data, "$GPRMC");
  4. if (source != null && source.Length >= 12)
  5. {
  6. //状态
  7. this.AnchorState = source[2];
  8. //纬度
  9. if (source[4].Length > 0 && source[3].Length > 2)
  10. {
  11. this.Latitude = string.Format("{0}{1},{2}", source[4], source[3].Substring(0, 2), source[3].Substring(2));
  12. }
  13. else
  14. {
  15. this.Latitude = "";
  16. }
  17. //经度
  18. if (source[6].Length > 0 && source[5].Length > 3)
  19. {
  20. this.Longitude = string.Format("{0}{1},{2}", source[6], source[5].Substring(0, 3), source[5].Substring(3));
  21. }
  22. else
  23. {
  24. this.Longitude = "";
  25. }
  26. //速度
  27. if (source[7].Length > 0)
  28. {
  29. this.NSpeed = double.Parse(source[7]);
  30. }
  31. else
  32. {
  33. this.NSpeed = 0;
  34. }
  35. //方位
  36. if (source[8].Length > 0)
  37. {
  38. this.Track = double.Parse(source[8]);
  39. }
  40. else
  41. {
  42. this.Track = 0;
  43. }
  44. //磁偏角和方位
  45. if (source[10].Length > 0 && source[11].Length > 0)
  46. {
  47. this.Magnetic = string.Format("{0} {1}", source[11], source[10]);
  48. }
  49. else
  50. {
  51. this.Magnetic = "";
  52. }
  53. //模式
  54. if (source.Length >= 13)
  55. {
  56. this.WorkMode = source[12];
  57. }
  58. //时间
  59. try
  60. {
  61. if (source[9].Length == 6 && source[1].Length >= 6)
  62. {
  63. string dtString = string.Format("{0}-{1}-{2} {3}:{4}:{5}",
  64. source[9].Substring(4),
  65. source[9].Substring(2, 2),
  66. source[9].Substring(0, 2),
  67. source[1].Substring(0, 2),
  68. source[1].Substring(2, 2),
  69. source[1].Substring(4));
  70. this.UTCDateTime = DateTime.Parse(dtString);
  71. }
  72. }
  73. catch { return false; }
  74. return true;
  75. }
  76. return false;
  77. }
     //运输定位数据private bool GPRMC_Parse(string data){string[] source = Split(data, "$GPRMC");if (source != null && source.Length >= 12){//状态this.AnchorState = source[2];//纬度if (source[4].Length > 0 && source[3].Length > 2){this.Latitude = string.Format("{0}{1},{2}", source[4], source[3].Substring(0, 2), source[3].Substring(2));}else{this.Latitude = "";}//经度if (source[6].Length > 0 && source[5].Length > 3){this.Longitude = string.Format("{0}{1},{2}", source[6], source[5].Substring(0, 3), source[5].Substring(3));}else{this.Longitude = "";}//速度if (source[7].Length > 0){this.NSpeed = double.Parse(source[7]);}else{this.NSpeed = 0;}//方位if (source[8].Length > 0){this.Track = double.Parse(source[8]);}else{this.Track = 0;}//磁偏角和方位if (source[10].Length > 0 && source[11].Length > 0){this.Magnetic = string.Format("{0} {1}", source[11], source[10]);}else{this.Magnetic = "";}//模式if (source.Length >= 13){this.WorkMode = source[12];}//时间try{if (source[9].Length == 6 && source[1].Length >= 6){string dtString = string.Format("{0}-{1}-{2} {3}:{4}:{5}",source[9].Substring(4),source[9].Substring(2, 2),source[9].Substring(0, 2),source[1].Substring(0, 2),source[1].Substring(2, 2),source[1].Substring(4));this.UTCDateTime = DateTime.Parse(dtString);}}catch { return false; }return true;}return false;}
转载自:csdn(叶帆),http://blog.csdn.net/yefanqiu/archive/2008/06/20/2568427.aspx

转载于:https://www.cnblogs.com/sql4me/archive/2010/06/23/1763340.html

GPS NMEA0183协议解析(转载)相关推荐

  1. 【GPS - NMEA-0183协议】

    GPS - NMEA-0183协议 NMEA-0183协议标准 1. 协议格式 2. 常见的GPS数据协议格式 2.1 GGA 2.2 GSA 2.3 GSV 2.4 RMC 2.5 VTG 2.6 ...

  2. GPS NMEA协议解析之通用语句

    GPS NMEA协议解析(NMEA通用语句) 文章目录 前言 一.NMEA协议简介 二.NMEA数据格式 1.GGA(全球定位系统定位数据) 2.GSA(GNSS 精度因子与有效卫星) 3.GSV(可 ...

  3. GPS 入门 4 —— GPS NMEA-0183协议 [转]

    GPS 入门 4 -- GPS NMEA-0183协议 [转] (2008-10-11 18:42:39) <script> var $tag='gps,nmea-0183协议,超级终端, ...

  4. GPS NMEA-0183协议详解

    NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronic ...

  5. GPS NMEA-0183协议常用数据格式及解析攻略

    GPS协议标准目前常用到的是NMEA-0183,很显然,这是由NMEA发布的一个标准. NMEA是National Marine Electronics Association ,即美国国家海洋电子协 ...

  6. GPS NMEA-0183协议常用报文数据格式

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 整理的GPS有关的协议分析资料." 之前分析一些车载设备的流量时,有部分经验,在这里和大家分享. 产生这些流量的设备通常是实体终端 ...

  7. c语言gga字符串校验和代码,NMEA-0183协议解析(示例代码)

    NMEA-0183 NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association )为海用电子设备制定的标准格式.目前业已成了GPS导航设备 ...

  8. SL651-2014全协议解析

    SL651-2014协议解析 转载请注明来源 链路维持报2F 上行报文: 7E7E01001234567812342F0008020003591011155111036BCA7E7E009876543 ...

  9. python模拟gps定位_python解析nmea0183协议获取GPS定位信息

    python解析nmea0183协议获取GPS定位信息 nmea0183协议里面定位数据主要在GPRMC报文里面,下面是报文的大体形式: b'$GPRMC,111025.00,A,2517.03374 ...

最新文章

  1. c++中static_cast用法与uchar/char的区别
  2. 字符串数组-获取两个字符串中最大的相同子串(最大相同子串有且只有一个)
  3. 跳石头 NOIP2015 提高组 Day2 T1
  4. 用javah 导出类的头文件, 常见的错误及正确的使用方法
  5. 【C/C++】代码优化技巧
  6. 深度学习在遥感图像目标检测中的应用综述
  7. java网络编程与分布式计算_Java网络编程与分布式计算
  8. python @修饰符_python函数修饰符@的使用方法解析
  9. oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表...
  10. 802d简明调试手册_SINUMERIK-828D简明调试手册.pdf
  11. Web MVC模式实现
  12. 使用javamail 发送邮件
  13. ArcGIS初步 系列视频教程
  14. v-for中为何要使用key
  15. 实现简易网易云音乐播放器
  16. 直流电机控制原理与TB6612FNG(初识编码器)
  17. AD软件——设计总结(差分布线,蛇形布线)
  18. 斩波电路---视频课笔记
  19. 机器视觉——远心镜头(1)
  20. 2022年产品经理考这个证书绝对超值(NPDP)

热门文章

  1. 计算几何-判断两条线段是否相交
  2. 博弈-巴什博弈-P/N图
  3. word2vec需要去标点吗_word2vec训练词向量前期处理-中文分词等
  4. 正则表达式(思维导图速查版)
  5. OpenGL基础35:帧缓冲(下)之简单图像处理
  6. 基于范围的for循环
  7. C++的STL标准库学习(stack)栈
  8. 1196 骨牌铺放(宁波大学oj)
  9. 利用vscode插件C51生成C51的hex文件
  10. 8255工作方式一A口和B口输出