==========================================================================
主機作業系統:Centos 6.7
交叉編譯器環境:arm-linux-gcc-4.5.4 (可通過指令/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -v查詢)
開發闆平台: fl2440
Linux核心版本: linux-3.0 .54
子產品:安信可A7子產品 ========================================================================== 1.安信可A7子產品接線與開啟GPS 首先按照我們之前測試GPRS連線連上子產品,波特率為115200.發送AT指令測試是否能用有傳回。接着用指令AT+GPS=1打開GPS,傳回OK即打開。打開 GPS/AGPS 後,預設 NEMA 資訊從 GPS_TXD 管腳以 9600 的波特率輸出,如果要讓 NEMA 從 AT 序列槽輸出,可以使用 AT+GPSRD。我這裡使用AT+GPSRD=3表示每隔3秒輸出資訊。子產品一上電一兩分鐘後就能正确采集到gps資料了。采集到資料後,關閉序列槽,把A7子產品的接線的TXD線接到子產品的GPS資料TXD上,并把波特率設定為9600,打開序列槽後,可以看到GPS資料每隔1s輸出。測試結果如下圖所示。

2.GPS資料解析 2.1GPS協定NMEA-0183簡介 NMEA 0183是美國國家海洋電子協會(National Marine ElectronicsAssociation)為海用電子裝置制定的标準格 式。目前業已成了GPS導航裝置統一的RTCM(Radio Technical Commission for Maritimeservices)标準協定. GPS接收機上電後,會自動通過序列槽或USB口發送NMEA0183格式的資料包,它是一組包含有各種地理位置資訊的字元串,字元串格式為: $資訊類型,xxx,xxx,xxx,xxx,xxx,xxx,xxx, 每行開頭的字元都是‘$’,接着是資訊類型,後面是資料,以逗号分隔開。 資訊類型為: GPGSV:可見衛星資訊 GPGLL:地理定位資訊 GPRMC:推薦最小定位資訊 GPVTG:地面速度資訊 GPGGA:GPS定位資訊 GPGSA:目前衛星資訊
這裡我們隻解析GPRMC的資訊,$GPRMC語句的格式如下: $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh< CR>< LF>
一行完整的資料:
$GPRMC,060916.000,A,3029.65900,N,11423.63928,E,0.00,0.00,120617,,,A*64
字段0:$GPRMC,語句ID,表明該語句為Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦最小定位資訊 字段1:UTC時間,hhmmss.sss格式【6:09:16】 字段2:狀态,A=定位,V=未定位【定位】 字段3:緯度ddmm.mmmm,度分格式(前導位數不足則補0)【3029.65900】 字段4:緯度N(北緯)或S(南緯)【北緯】 字段5:經度dddmm.mmmm,度分格式(前導位數不足則補0)【11423.63928】 字段6:經度E(東經)或W(西經)【東經】 字段7:速度,節,Knots【0.00節】 字段8:方位角,度【0.00】 字段9:UTC日期,DDMMYY格式【120617】 字段10:磁偏角,(000 - 180)度(前導位數不足則補0)【空】 字段11:磁偏角方向,E=東W=西【空】 字段12:模式,A=自動,D=差分,E=估測,N=資料無效(3.0協定内容)【自動】 字段13:校驗值【校驗值為6F】 解析内容: (1) 時間,這個是格林威治時間,是世界時間(UTC),我們需要把它轉換成中原標準時間(BTC),BTC和UTC差了8個小時,要在這個時間基礎上加8個小時。 (2) 定位狀态,在接收到有效資料前,這個位是‘V’,後面的資料都為空,接到有效資料後,這個位是‘A’,後面才開始有資料。 (3) 緯度,我們需要把它轉換成度分秒的格式,計算方法: 如接收到的緯度是:3029.65900 3029.65900 / 100 = 30.2965900 可以直接讀出30度 3029.65900-30 * 100 = 29.65900 可以直接讀出29分 29.65900-29 = 0.65900 * 60 = 39.54 讀出39秒 是以緯度為:30度29分39秒。 同理經度為:114度23分38分 (4) 南北緯,這個位有兩種值‘N’(北緯)和‘S’(南緯) (5) 經度的計算方法和緯度的計算方法一樣 (6) 東西經,這個位有兩種值‘E’(東經)和‘W’(西經) (7) 速率,這個速率值是 海裡/時,機關是節,要把它轉換成千米/時,根據:1海裡 = 1.85公裡,把得到的速率乘以1.85。 (8) 航向,指的是偏離正北的角度 (9) 日期,這個日期是準确的,不需要轉換 3.關于經緯度的換算: 因為我們收到的經緯度的格式是aabb.mmmm格式,往往要經過換算的。比如百度地圖上需要的格式是,xx.mmmmm。這個換算過程其實蠻簡單的,大緻表示為aa+bb/60+mmmm/60/60。 當然我們也可以用工具進行轉換,不過編寫程式為了顯示需要,需要我們進行換算,是以給出下面簡單的算法(存在一定的誤差)。
float caculate(float *x)
{
int a;
float b,c,d,e;
a=*x%100; //30
b=(int)((*x/100-a)*100); //29
c=((*x/100-a)*100-b)*60;
d=b/60;
e=c/60;
f=a+d+e;
return e;
}
計算得到的經緯度度分秒轉換為經緯度
在地圖工具上查詢就能看到我們的位置了
http://www.gpsspg.com/maps.htm GPS轉換位址
http://www.ab126.com/Geography/2703.html 經緯度轉換 4.用開發闆連接配接子產品接收GPS資料: (1)使能USB接口: 因為我們的開發闆的兩個序列槽用的是RS232,而我們的子產品是TTL電平,是以我們并不能用序列槽直接去接我們的子產品,我們需要用USB轉序列槽線接到開發闆的USB口,是以,我們需要對核心進行修改。在核心的make menuconfig->Device Drivers->USB support ->USB Serial Converter support選項中選擇USB CP210x family of UART Bridge Controllers 選項,重新編譯燒錄核心。然後我們把USB轉序列槽線插到我們的開發闆USB接口上,通過網線連接配接開發闆,用secuercrt遠端登入開發闆。我們可以看到/dev目錄下有個USB0的裝置。 >ls /dev
(2)microcom指令監聽USB接口: >:microcom -s 9600 /dev/ttyUSB0 -t 機關毫秒,無操作自動退出時間,-s 機關bps,序列槽波特率,通過ctrl+x可以退出監聽。
監聽到該接口後,我們可以對該接口進行程式設計操作,擷取經緯度資訊。
GPS資料包格式+資料解析 點選打開連結