GPS通信数据格式NMEA

NMEA协议是为了在不同的GPS导航设备中建立统一的RTCM(海事无线电技术委员会)标准,它最初是由美国国家海洋电子协会(NMEA—The NationalMarine Electronics Association)制定的。NMEA协议有0180、0182和0183这3种,0183可以认为是前两种的升级,也是目前使用最为广泛的一种。在实际使用中,如果只是接收GPS的输出.则只需两根信号线 GPS数据输出线和信号地线,可以直接将EIA-422输出通道两条信号线中的一条同计算机的Rs232C输入线相连。

GPS(全球定位系统)接收机与手持机之间的数据交换格式一般都由生产厂商缺省定制,其定义内容普通用户很难知晓,且不同品牌、不同型号的GPS接收机所配置的控制应用程序也因生产厂家的不同而不同。所以,对于通用GPS应用软件,需要一个统一格式的数据标准,以解决与任意一台GPS的接口问题。NMEA-0183数据标准就是解决这类问题的方案之一。NMEA协议是为了在不同的GPS导航设备中建立统一的RTCM(海事无线电技术委员会)标准,它最初是由美国国家海洋电子协会(NMEA—The NationalMarine Electronics Association)制定的。NMEA协议有0180、0182和0183这3种,0183可以认为是前两种的升级,也是目前使用最为广泛的一种

NMEA通讯协议硬件接口

符合NMEAO183标准的GPS接收机的硬件接口能够兼容计算机的RS-232C协议串口,然而,严格来说NMEA标准不是RS-232C,规范推荐依照EIA422(也称为RS-422)。是一个与RS-232C不同的系统。标准RS-232C采用负逻辑,即逻辑“1”表示-5V~ -15v,逻辑“0”表示+5V~+15V,利用传输信号线和信号地之间的电压差进行传输。而EIA-422是利用导线之间的信号电压差来传输信号的,其每个通道要用两条信号线,一条是逻辑“1”,~条是逻辑“0”,通过传输线驱动器和传输线接收器实现逻辑电平和电位差之间的转换,一般允许驱动器输出为±2V~ ±6V 。

虽然存在区别,但在实际使用中,如果只是接收GPS的输出.则只需两根信号线 GPS数据输出线和信号地线,可以直接将EIA-422输出通道两条信号线的中一条同计算机的Rs232C输入线相连(这个方法我并没有试验过,是从别的地方听来的,有兴趣有条件的兄弟可以动手实验一下,不过后果自负哦!呵呵)。

NMEA通讯协议所定义的标准通讯接口参数为:
波特率:4800bit/s;
数据位:8位;
停止位:1位;
奇偶校验:无;

NMEA-OI83语句解析

NMEA通讯协议所规定的通讯语句都已是以ASCII码为基础的,NMEA-0183协议语句的数据格式如下:“$”为语句起始标志;“,”为域分隔符;“ *”为校验和识别符,其后面的两位数为校验和,代表了“$”和“*”之间所有字符的按位异或值(不包括这两个字符);“/”为终止符,所有的语句必须以来结束,也就是ASCII 字符的“回车”(十六进制的0D)和“换行”(十六进制的0A)。

典型的NMEA0183语句如下面的GPGGA语句。

当GPS正常工作时,语句如:
$GPGGA,053152,3957.7484,N,11626.7626,E,1,06,1.5,88.1,M,-8.0,M,,*64
当GPS收不到卫星信号时,GPGGA语句输出变为:
$GPGGA,053247,3957.7484,N,11626.7626,E,0,00,,,M,,M,,*46
除标准语句外,NMEAO183规范还允许个别厂商定义私有的语句格式,这些语句以“$P”开始,然后是三个字符长度的厂商识别号,跟着是厂商定义的数据,接下来的数据格式与标准格式相同。
如Garmin的PGRME私有格式如下:
$PGRME,8.9,M,6.1,M,10.8,M*11
其中,“P”代表私有格式,“GRM”是Garmin的代码,“E”表示语句类型。

NMEA数据处理中的注意事项

如果开发基于GPS的应用系统,就需要将GPS作为信息源,正确接收和解析GPS发送的NMEA一0183数据。此时,在编程实现时需要注意几个问题。

1、通讯端口的设置
虽然NMEA规范推荐的串行通讯参数为“波特率:4800;奇偶校验:无;数据位:8;停止位:1”,但也有厂商的产品允许用户将波特率设置的更高,此时需要注意设置计算机的接口参数与GPS设备一致。

2、 所需信息的正确提取
NMEA—O183是以语句形式发送数据的,接收机可能发送很多类型的语句,而我们需要的可能只是某些语句中的几个字段。因此就需要对接收到的数据进行解析,取得所需的信息。另外,可能会由于小数点位数不同等原因,语句的长度是可变的,因而分离感兴趣的信息时,不能按照该信息在语句中所处的字符位置来查找,只能依据逗号分隔符,这一点在数据提取的过程中非常重要。笔者就经常遇到一些应用软件工程师,在提取NMEA语句中的信息的时候按照字符的长度提取,这样编出来的程序,通用性差,而且经常会出现信息提取错误的问题。

以上都是我们在程序中需要注意的问题。为解决信息的正确提取问题,并提高程序的复用性,可以编写适当的函数,如一个函数用来分离语句(即通过$字符判断语句头,一直到换行回车结束一条语句);一个函数用来判断语句中的字段数(通过“,”分隔符来提取语句字段),还有一个函数用来返回语句中指定字段的内容。有了这三个函数,就可以方便的提取所需的信息,此时的工作只是简单字符串比较和显示格式的变换
检验和的计算与比较

最后,为了确保所采集的GPS数据的可靠性,必须进行检验和的计算与比较。检验和hh为“$”与“*”之间的所有字符按位异或的结果,并将其高4位和低4位各用一个十六进制数(字母大写)表示出来。为此,需编写函数,从语句头识别符“*”开始,计算检验和,直至“*”到达为止,这时“*”号后面的两个字符就是检验码,将自己的计算结果同这两个检验码字符比较,若不同,按出错处理,并继续运行;若相同,则说明通讯成功,数据接收正确,可以处理该语句,提取所需数据。

Dos和windows采用回车+换行CR/LF表示下一行,而UNIX/Linux采用换行符LF表示下一行,苹果机(MAC OS系统)则采用回车符CR表示下一行.CR用符号’\r’表示, 十进制ASCII代码是13, 十六进制代码为0×0D;LF使用’\n’符号表示, ASCII代码是10, 十六制为0×0A.所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示

说 明:NMEA0183格式以“$”开始,主要语句有GPGGA,GPVTG,GPRMC等

1、 GPS DOP and Active Satellites(GSA)当前卫星信息

$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF>

<1>模式 :M = 手动, A = 自动。
<2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。
<4> PDOP位置精度因子(0.5~99.9)
<5> HDOP水平精度因子(0.5~99.9)
<6> VDOP垂直精度因子(0.5~99.9)
<7> Checksum.(检查位).

2、 GPS Satellites in View(GSV)可见卫星信息

$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF>

<1> GSV语句的总数
<2> 本句GSV的编号
<3> 可见卫星的总数,00 至 12。
<4> 卫星编号, 01 至 32。
<5>卫星仰角, 00 至 90 度。
<6>卫星方位角, 000 至 359 度。实际值。
<7>讯号噪声比(C/No), 00 至 99 dB;无表未接收到讯号。
<8>Checksum.(检查位).
第<4>,<5>,<6>,<7>项个别卫星会重复出现,每行最多有四颗卫星。其余卫星信息会于次一行出现,若未使用,这些字段会空白。

3、Global Positioning System Fix Data(GGA)GPS定位信息

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>

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

4、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式
<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=数据无效)

5、 Track Made Good and Ground Speed(VTG)地面速度信息

$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh<CR><LF>

<1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
<2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
<3> 地面速率(000.0~999.9节,前面的0也将被传输)
<4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
<5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)

GPS NMEA-0183标准数据介绍

GPS数据遵循NMEA-0183协议,该数据标准是由NMEA(National Marine Electronics Association,美国国家海事电子协会)于1983年制定的。统一标准格式NMEA-0183输出采用ASCII 码,其串行通信的参数为:波特率=4800bps,数据位=8bit,开始位=1bit,停止位=1bit,无奇偶校验。

数据传输以“语句”的方式进行,每个语句均以“$”开头,然后是两个字母的“识别符”和三个字母的“语句名”,接着就是以逗号分割的数据体,语句末尾为校验和,整条语句以回车换行符结束。
NMEA-0183的数据信息有十几种,这些信息的作用分别是:$GPGGA:输出GPS的定位信息;$GPGLL:输出大地坐标信息;$GPZDA:输出UTC时间信息;$GPGSV:输出可见的卫星信息;$GPGST:输出定位标准差信息;$GPGSA:输出卫星DOP值信息;$GPALM:输出卫星星历信息;$GPRMC:输出GPS推荐的最短数据信息等。
分别介绍如下:

1 GPRMC语句(Recommended Minimum Specific GPS/TRANSIT Data-RMC,推荐定位信息1次/1秒)
对于一般的GPS动态定位应用,GPRMC语句完全满足要求。该语句中包括经纬度、速度、时间和磁偏角等字段,这些数据为导航定位应用提供了充分的信息。下表详细说明GPRMC语句中的各个字段:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<ll>,<12>
字段 $GPRMC语句意义——取值范围
<1> UTC时间:hhmmss.ss——000000.00~235959.99
<2> 状态,有效性 ——A表示有效;V表示无效
<3> 纬度格式:ddmm.mmmm——0000.00000~8959.9999
<4> 南北半球——N北纬;S南纬
<5> 经度格式:dddmm.mmmm——00000.0000~17959.9999
<6> 东西半球——E表示东经;W表示西经
<7> 地面速度——000.00~999.999
<8> 速度方向——000.00~359.99
<9> 日期格式,月日年——010100~123199
<10> 磁偏角,单位:度——00.00~99.99
<ll> 磁偏角方向——E表示东;W表示西
<12> 模式指示及校验和—— A=自主定位,D=差分,E=估算,N=数据无效
例如:$GPRMC,074529.82,A,2429.6717,N,11804.6973,E,12.623,32.122,010806,,W,A*08

2 GPGGA语句(Global Positioning System Fix Data-GGA,GPS定位信息, 输出1次/1秒)
GPS定位主要数据,该语句中包括经纬度、质量因子、HDOP、高程、基准站号等字段。下表详细说明GPGGA语句中的各个字段:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<ll>,<12>,<l3>,<14>
字段 $GPGGA语句意义——取值范围
<1> UTC时间:hhmmss.ss——000000.00~235959.99
<2> 纬度,格式:ddmm.mmmm ——0000.00000~8959.9999
<3> 南北半球——N北纬;S南纬
<4> 经度格式:dddmm.mmmm ——00000.0000~17959.9999
<5> 东西半球——E表示东经;W表示西经
<6> 质量因子——0=未定位,1=GPS单点定位固定解,2=差分定位,3=PPS解;4=RTK固定解;5=RTK浮点解;6=估计值;7=手工输入模式;8=模拟模式;
<7> 应用解算位置的卫星数——00~12
<8> HDOP,水平图形强度因子——0.500~99.000 ;大于6不可用
<9> 天线高程(海平面)——-9999.9~99999.9
<10> 线线高程单位(m) ——m
<ll> 大地水准面起伏——地球椭球面相对大地水准面的高度
<12> 大地水准面起伏单位(m)   ——m
<13> 差分GPS数据期——差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空),不使用DGPS时为空
<14> 基准站号——0000~1023;不使用DGPS时为空
$GPGGA,074529.82,2429.6717,N,11804.6973,E,1,8,1.098,42.110,M,,M,,*76

3 GPGSV语句(GPS Satellites in View-GSV,可见卫星信息,1次/5秒)
GPS可见星的方位角、俯仰角、信噪比等每条语句最多包括四颗卫星的信息,每颗卫星的信息有四个数据项,即:(4)-卫星号,(5)-仰角,(6)-方位角,(7)-信噪比
$GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>,<16>,<17>,<18>,<19>
字段 $GPGSV语句意义——取值范围
<1> 总的GSV语句电文数——0~12
<2> 当前GSV语句号
<3> 可视卫星总数——0~32
<4> 卫星号——1~32
<5> 仰角——00~90
<6> 方位角——000~359
<7> 信噪比——00~99dB无表未接收到讯号
<8> 卫星号——1~32
<9> 仰角——00~90
<10> 方位角——000~359
<ll> 信噪比——00~99dB无表未接收到讯号
<12> 卫星号——1~32
<13> 仰角——00~90
<14> 方位角——000~359
<15> 信噪比——00~99dB 无表示未接收到讯号
<16> 卫星号——1~32
<17> 仰角——00~90
<18> 方位角——000~359
<19> 效验和,格式:*效验和——检查位
$GPGSV,3,1,11,1,83,54,32,3,19,192,28,6,26,57,36,7,51,140,37*7D
$GPGSV,3,2,11,14,40,136,34,16,64,266,36,20,21,293,,22,2,168,*4C
$GPGSV,3,3,11,23,10,321,,25,53,7,40,30,2,46,*48

4. $GPVTG语句(Track Made Good and Ground Speed-VTG,地面速度信息)
格式:$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh
字段 $GPVTG语句意义——取值范围
<1> 以真北为参考基准的地面航向——000.000~359.999
<2> 以磁北为参考基准的地面航向——000.000~359.999
<3> 地面速率——000.000~999.999节
<4> 地面速率——0000.0~1851.8公里/小时
<5> 模式指示——A=自主定位,D=差分,E=估算,N=数据无效(仅NMEA0183 3.00版本输出)
<6> hh 校检位
$GPVTG,257.314,T,257.314,M,10.739,N,19.888,K,A*2F

5、 $GPGSA语句(GPS DOP and Active Satellites-GSA,当前卫星信息,1次/1秒)
GSA : GNSS 的当前卫星和精度因子,包括可见卫星PRN号,以及PDOP、HDOP、VDOP。如:
<1>     模式 ——M = 手动, A = 自动。
<2>     定位类型——1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3>     PRN 数字——01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
<4>     PDOP位置精度因子——0.5~99.9
<5>     HDOP水平精度因子——0.5~99.9
<6>     VDOP垂直精度因子——0.5~99.9
<7>     Checksum.(检查位).
$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7>
$GPGSA,A,3,19,11,03,23,27,13,16,,,,,,3.43,1.67,2.99*0E

6. $GPGLL语句(输出大地坐标信息)
$GPGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*61
字段 $GPGLL语句意义——取值范围
<1> 纬度:ddmm.mmmmm——0000.00000~8959.9999
<2> 南纬或北纬——北纬N,S南纬
<3> 经度:dddmm.mmmmm——0000.00000~17959.99999
<4> 东、西经 ——东经E,西经W
<5> UTC时间——hh:mm:ss
<6> 数据状态——A有效,V无效
$GPGLL,2431.25310,N,11806.15429,E,081401.00,A,A*61

7.$GPZDA 语句(输出UTC时间和日期信息)
$GPZDA, <1>,<2>,<3>,<4>,<5>*hh
字段 $GPZDA语句意义——取值范围
<1> 时间:hhmmss.ss——0000000.00~235959.99
<2> 日——00~31
<3> 月——00~12
<4> 年——0000~9999
<5> 地方时与世界时之差
<6> 检校位 *hh——*
$GPZDA,081401.00,14,09,2006,00,00*62

8. $GPGST 语句(GPS 伪距噪声统计,包括了三维坐标的标准偏差信息)
字段——示例——说明
Sentence ID ——$GPGST
UTC Time——024603.00——UTC time of associated GGA fix
RMS deviation——3.2——Total RMS standard deviation of ranges inputs to the navigation solution
Semi-major deviation——6.6——Standard deviation (meters) of semi-major axis of error ellipse
Semi-minor deviation——4.7——Standard deviation (meters) of semi-minor axis of error ellipse
Semi-major orientation——47.3——Orientation of semi-major axis of error ellipse (true north degrees)
Latitude error deviation——5.8——Standard deviation (meters) of latitude error
Longitude error deviation——5.6——Standard deviation (meters) of longitude error
Altitude error deviation——22.0——Standard deviation (meters) of latitude error
Checksum—— *58
$GPGST,024603.00,3.2,6.6,4.7,47.3,5.8,5.6,22.0*58

9. $GPCN0语句

各颗用于解算的卫星信噪比:
$GPCN0,30,40,35,26,24,36,31,38
其他说明:
II. 输出格式:
GPGGA(1次/1秒)
GPGSA(1次/1秒)
GPGSV(1次/5秒)
GPRMC(1次/1秒)
另可选用GLL,VTG或SiRF二进制格式

III.使用座标系统:WGS84
DOP值有三种测量类型:
水平、垂直和说明(mean)。HDOP测量它和经纬度的关系作为精度,VDOP测量他和海拔的关系作为精度,PDOP,给出一个关于经纬度、海拔精度的完整等级。每个DOP值都是1到50之间数值,其中50 表示非常差的精度,1则表示很理想的精确度。
表2-1列出了划分的一份精确的PDOP值细目分类。PDOP分类描述:
PDOP值——评价——说明
1~2——理想——这是最高的信任级别,应用程序可以在任何时候获取最高的精度
2~3——极好——值得信任的级别,位置的测量相当精确,可以应用于绝大多数应用程序,但是有些非常敏感的应用程序就不行了
4~6——好——这是用来做商业应用的最低等级。位置的测量可以用来做线路导航建议
7~8——中等——位置测量可以用来计算,但是质量还应该提高。推荐用语天空观察
9~20——中下——信任级别很低。位置测量结果应该丢弃或者仅用于粗略估计当前位置
21~50——差——在这个级别的测量结果是不精确的,大概会有半个足球场大的误差,应该丢弃