$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.682A
代表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.00315.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++;
}
真感激!
我實做解GPS模組 怎 ',' 是有算在內 ?
NMEA token應該是要包含','的
如果會跳過的話就失去checksum的意義了
只是要計算的範例token如果是偶數個',' XOR會互相抵銷
如果','不算的話
$GPGSV,1,1,02,14,,,37,25,,,46,,,,,,,,*7F
$GPGSV110214372546*7F
這兩者等價 但明顯有一個是錯誤的語句
張貼留言