NMEA-0183协议介绍以及常见报文解析

2024-03-12 04:44

本文主要是介绍NMEA-0183协议介绍以及常见报文解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

NMEA 协议是一种用于海上和航空领域的数据通信协议。它的全称是 National Marine Electronics Association (美国国家海洋电子协会),是一种标准化的数据格式,用于传输位置、速度、时间等信息。在船舶导航和 GPS 接收器中经常使用 NMEA 协议来实现设备之间的数据交换和通信。NMEA 协议最常见的是 0183 版本,除此还有其他版本:

1. NMEA 0183: 这是最常见和广泛使用的NMEA协议版本,定义了一系列标准数据格式,用于在不同海洋电子设备之间进行数据交换,如GPS接收器、雷达、自动驾驶系统等。2. NMEA 2000: 这是 NMEA 协议的更新版本,也称为 NMEA 2000,采用基于控制器局域网(CAN)的通信协议,提供更高的数据传输速度和更好的可靠性,用于连接船舶上的各种电子设备。3. NMEA 0183 HS: 这是NMEA 0183协议的高速版本,用于支持更快的数据传输速度,适用于需要更高精度和更快更新率的应用。

本文主讲 NMEA 0183 版本,0183协议有多个版本包括 V1.0、V1.5、V2.0、V3.0 和最新的 V4.11 ,等等,协议向前兼容。

由于未找到 4.11 版本,本文主要讲 4.10 版本,协议结构来源参考英文原版《NMEA 0183-Standard for Interfacing Marine Electronic Devices(June 2012 VERSION 4.10)》。

本文主要介绍整体的协议结构组成和常见的 NMEA 报文,NMEA 还包含了其他大量的报文格式,但相对都少用,有兴趣的可以去看原版协议。

帧格式和分类

协议帧说明

$aaccc ,ddd ,ddd ,...... ,ddd*hh<CR><LF>1、“$”——帧命令起始位
2、aaccc——地址域,前两位为识别符,后三位为语句名
3、ddd...ddd——数据
4、“*”——校验和前缀
5、hh——校验和(check sum),$与*之间所有字符ASCII码的校验和(各字节做异或运算,得到校验和后,在转换16进制格式的ASCII字符。)
6<CR><LF>——CR(Carriage  Return)+ LF (Line Feed)帧结束,回车换行。

NMEA 协议可以分为通用语句专用语句

分类-通用语句

通用语句包括:GGA、RMC、GSV、GSA、VTG、GLL、ZDA 、TXT 等,GPS 系统还含有一些未在此列出的其它信号,这里不多做列举。

通用语句还需要加上所使用的定位系统前缀,具体如下表:

GNSS 系统GNSS系统发送器标识(NMEA3.01)GNSS系统发送器标识(V4.1)
GalileoGAGA
BeiDouBDGB
GPSGPGP
QZSSGPGQ
NAVICIRGI
GLONASSGLGL
Combination of Multiple Satellite SystemsGNGN

分类-专用语句

专用语句是各个接收机生产商自定义的语句,以$P开头,如$PSTM、$PMTK、$PQ等。

$PMTK104*37 	
$PQEPE,W,1,1*2A

本文只介绍通用的语句,下面对几个常见的语句进行解析介绍。

GGA-GPS定位信息

GGA(Global Positioning System Fix Data)GPS 定位信息,格式如下:

$XXGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
<1> UTC 时间,hhmmss(时分秒)格式,和北京时间差 8 个小时。
<2> 纬度 ddmm. mmmm(度分)格式(前面的 0 也将被传输)
<3> 纬度半球 N(北半球)或 S(南半球)
<4> 经度 dddmm. mmmm(度分)格式(前面的 0 也将被传输)
<5> 经度半球 E(东经)或 W(西经)
<6> GPS 状态:0=未定位,1=单点定位,2=SBAS 差分定位,4=RTK 固定解,5=RTK 浮点解,6=惯导定位,7=手动输入模式,8=模拟模式
<7> 正在使用解算位置的卫星数量(00~12)(前面的 0 也将被传输)
<8> HDOP 水平精度因子(0.5~99.9<9> 海拔高度(-9999.9~99999.9)M :单位,米
<10> 地球椭球面相对大地水准面的高度M :单位,米
<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
<12> 差分站 ID 号 0000~1023(前面的 0 也将被传输,如果不是差分定位将为空)

例子:

$GPGGA,1661229.478,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M,7.3,M,,0000*18

RMC-推荐定位信息

RMC(Recommended Minimum Specific GNSS Data)推荐定位信息,4.10 相比 3.0增加<13>导航状态标识字段,具体格式如下:

// 3.0
$XXRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
// 4.1
$XXRMC,<1>,<2>,<3>,<4

这篇关于NMEA-0183协议介绍以及常见报文解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800170

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N