NMEA 0183之 GPRMC資料處理

2021-07-13 05:37:43 字數 3929 閱讀 5981

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協議總體來說,相對簡單,是氣象上比較成熟的協議。主要有以下幾個引數及其格式 風速和風向 空氣溫度 土壤溫度 濕度 大氣壓 注 其中效驗部分主要採用的 異或效驗 即從 後第乙個字元到 前乙個字元進...