nmea-0183
u 以下為gps
晶元串列埠發出的資料:
201512_15:42:3712,$gptxt,antstatus=short*43
201512_15:42:37$gngga,074219.000,3021.516740,n,12005.998703,e,1,9,1.09,20.996,m,6.991,m,,*42
201512_15:42:37$gngll,3021.516740,n,12005.998703,e,074219.000,a,a*45
201512_15:42:37$gpgsa,a,3,20,18,25,10,24,15,22,14,,,,,1.38,1.09,0.85*07
201512_15:42:37$bdgsa,a,3,06,,,,,,,,,,,,1.38,1.09,0.85*1a
201512_15:42:37$gpgsv,3,1,12,18,89,182,30,10,55,320,35,24,47,038,31,12,40,107,33*73
201512_15:42:38$gpgsv,3,2,12,14,34,297,29,22,33,315,32,25,31,156,32,15,25,077,31*7f
201512_15:42:38$gpgsv,3,3,12,20,22,140,31,31,08,227,27,37,,,,193,,,31*4a
201512_15:42:38$bdgsv,1,1,01,06,75,066,27*58
201512_15:42:38$gnvtg,128.46,t,,m,0.00,n,0.00,k,a*2a
201512_15:42:38$gnrmc,074219.000,a,3021.516740,n,12005.998703,e,0.00,128.46,311215,,,a*7e
u 資料接收:
gprmc格式,資料長度不會超過
70;
gpgga格式,資料長度不會超過
72;
ø 以』
$』開始儲存,若長度超過74則丟棄並重新接收,否則判斷結束符』
\r』』
\n』;
ø 首次收到』
\r』』
\n』則向gps
晶元傳送模式
(gps/bd/mix)
控制命令字;
ø 判斷gps_rx[3、4
、5]是否為』r、m、
c』,是則開始處理;
u 資料處理:
ø 判斷鎖定位; 若
>24
則需-24;
ø 日期:需修正
static void daterepair(void)
} else
}} else if((mon_tmp == 4) || (mon_tmp == 6) || (mon_tmp == 9) || (mon_tmp == 11))
} else
}} gps_data.date_time[0] = ((year_tmp / 10) << 4) + (year_tmp % 10); // year
gps_data.date_time[1] = ((mon_tmp / 10) << 4) + (mon_tmp % 10); // mon
gps_data.date_time[2] = ((day_tmp / 10) << 4) + (day_tmp % 10); // day
}
ø 經緯度
緯度dd
mm.mmmm(度分)格式
(前面的
0也被傳輸),如
3021.5167=120.099786;
經度dddmm.mmmm(度分)
格式(前面的0
也被傳輸
),如12005.9872=30.358613;
static void longlat_sel(uint8 *pd , uint8 len)
//gps_data.latitude[0] = 0;
switch(jj)
jjj = lookup(pd , ',' , 4 , len);
switch(jjj - j - jj - 2) // 小數點後的位數
}// 再處理經度
j = lookup(pd , ',' , 5 , len);
if(j)
switch(jj)
jjj = lookup(pd , ',' , 6 , len);
switch(jjj - j - jj - 2) // 小數點後的位數
}}
//換算為以秒為單位
0.1234』=0.1*60』』 + 0.02*60』』 + 0.003*60』』 + 0.0004*60』』;
//擴大
1000
倍=1*6000 + 2*600 + 3*60 + 4*6;
latitude_tmp = ((gps_data.latitude[0] >> 4) * 10 + (gps_data.latitude[0] & 0xf)) * 3600000;
latitude_tmp += (gps_data.latitude[1] >> 4) * 600000 + (gps_data.latitude[1] & 0xf) * 60000;
latitude_tmp += (gps_data.latitude[2] >> 4) * 6000 + (gps_data.latitude[2] & 0xf) * 600;
latitude_tmp += (gps_data.latitude[3] >> 4) * 60 + (gps_data.latitude[3] & 0xf) * 6;
longitude_tmp = ((gps_data.longitude[0] & 0xf) * 100 + (gps_data.longitude[1] >> 4) * 10 + (gps_data.longitude[1] & 0xf)) * 3600000;
longitude_tmp += (gps_data.longitude[2] >> 4) * 600000 + (gps_data.longitude[2] & 0xf) * 60000;
longitude_tmp += (gps_data.longitude[3] >> 4) * 6000 + (gps_data.longitude[3] & 0xf) * 600;
longitude_tmp += (gps_data.longitude[4] >> 4) * 60 + (gps_data.longitude[4] & 0xf) * 6;
longitude_tmp /= 64;
latitude_tmp /= 64;
ø 速度
車輛速度不會大於255
speed_tmp = (gps_data.speed[0] >> 4) * 1000 + (gps_data.speed[0] & 0xf) * 100 + (gps_data.speed[1] >> 4) * 10 + (gps_data.speed[1] & 0xf);
speed_tmp *= 1852; // 將速度knot轉換成公里/小時
speed_tmp /= 10000; // 縮小10000倍還原速度值
ø 角度
角度可能大於255
,需縮小才能單位元組傳送;
direct_tmp = (gps_data.angle[0] >> 4) * 1000 + (gps_data.angle[0] & 0xf) * 100 + (gps_data.angle[1] >> 4) * 10 + (gps_data.angle[1] & 0xf);
direct_tmp /= 16; // 方向為原來方向/1.6
標準NMEA協議
致物模組支援標準協議nmea 0183,下表是對nmea 0183協議結構的說明。表 1 nema結構表 名稱長度 描述 1 語句開始標誌 talker id 1 2gps nmea標示 nmea message id 3 語句標示 data field 依據實際資料 報文內容 1報文內容的結束標誌...
NMEA 0183協議介紹
nmea 0183 是美國國家海洋電子協會 national marine electronics association 為海用電子裝置制定的標準格式。目前業已成了gps 導航裝置統一的rtcm radio technical commission for maritime services 標準...
NMEA協議 上位機 c
前些時間寫做了兩款用nmea協議的上位機,在這裡做乙個總結和記錄。和大家分享,也為了以後不會忘記。nmea協議總體來說,相對簡單,是氣象上比較成熟的協議。主要有以下幾個引數及其格式 風速和風向 空氣溫度 土壤溫度 濕度 大氣壓 注 其中效驗部分主要採用的 異或效驗 即從 後第乙個字元到 前乙個字元進...