星期四, 9月 08, 2005

GPS NMEA Protocol

NMEA是GPS 的標準protocol,她是ASCII的字串,像
$GPRMC,053322.682,A,2502.6538,N,12121.4838,E,0.00,315.00,080905,,,A*6F
這一個command是GPS Recommanded GNSS data

053322.682
是UTC Time : 格式是hhmmss.sss所以是5:33:22.682
A
代表data是valid (如果找不到衛星,就會是V)
2502.6538
是緯度,格式是degree * 100 + minutes。但是minutes是100進位,所以要/100 * 60轉為degree,轉換後就是25'02'39.228''.
N
是代表緯度是北緯
12121.4838
是經度,格式是degree * 100 + minutes。minutes一樣要做/100*60的轉換,轉換後就是121'21'29.02''.
E
代表經度是東經
0.00
是速度,因為GPS天線沒動,所以是0.00
315.00
是方向
080905
是目前的日期,格式是ddmmyy,所以是05年9月8日
- -
接著有兩個欄位沒有用,所以空著
A
是Autonomous ?
*6F
是checksum
*** 所以用google earth就知道我把天線放在哪了****



格式是:
1.一律以 $ 符號開頭
2.$ 後是Message id. 5個ASCII Code.
3.一連串以','分開的欄位.
4.Checksum,checkum以'*'開始,後面是兩個ASCII code.
5.

$GPGSV,1,1,02,14,,,37,25,,,46,,,,,,,,*7F

$GPGSV : Satellites in View

Message ID : $GPGSV
Number of Messages : 1
Message number : 1
Satellites in view : 02 目看到的衛星數
Satellite Id : 14 Satellite vehicle 以下是第一個看到的衛星,編號14
Elevation : - Elevation of satellite in degree
Azimuth : - Azimuth of satellite in defree
SNR : 37 Signal to Noise ration in dbHz
Satellite id : 25 Satellite vehicle,以下是第二個看到的衛星,邊號25


NMEA Protocol中checksum的算法:
不包含開頭的'$',一直計算到'*'之前。一個byte一個byte的作XOR.

data++; // skip the heading '$' mark
sum = *data;
while(*data!='*') {
sum ^= *data;
data++;
}

所以可以知道,連command間的','符號也加入計算。


一般NMEA的report data中,用


有些擴充協定,用來設定,例如
$PNMRX103, NMEA report rate control
可以指定NMEA report資料的頻率
GGA,GLL,GSA,GSV,RMC,VTG,ZDA,ALL
例如:
$PNMRX103,ALL,0*1A
所有的report都停止。
$PNMRX103,RMC,2*02
每2 sec送出一次RMC report


$PNMRX100 設定baud rate
$PNMRX100,0,4800,0*48
設定
Protocol : 0 : NMEA Mode, 1: Bindary Mode (不要用這一個)
baud rate: 4800 其他可以設1200,2400,4800,9600,19200,38400,57600.
Parity : 0 : None, 其他1 2代表Odd, 2代表 Even.
所以上面的example代表:使用NMEA Mode, 4800, None Parity


這些設定在reset後都消失......


雖然Manual中說明support message有GGA,GLL,GSA,GSV,RMC,VTG,ZDA但是用ALL command開啟後,發現只有report GGA,GSA,RMC,VTG.

4 則留言:

匿名 提到...

關於 check sum 的計算, 版主有些地方搞錯了,GPS Token 中的 ',' 是不在計算內的.
Sample code 也有小bug!
應該是 :

data++;
sum = *(data);
data++; //版主漏了這行!!
while (*data != '*'){
if (*data != ',')
sum ^= *data;
data++;
}

checko 提到...

真感激!

匿名 提到...

我實做解GPS模組 怎 ',' 是有算在內 ?

提到...

NMEA token應該是要包含','的
如果會跳過的話就失去checksum的意義了
只是要計算的範例token如果是偶數個',' XOR會互相抵銷

如果','不算的話
$GPGSV,1,1,02,14,,,37,25,,,46,,,,,,,,*7F
$GPGSV110214372546*7F
這兩者等價 但明顯有一個是錯誤的語句

網誌存檔