摘要:本文以Holux GR-85 GPS 模塊為例,介紹了在C#環(huán)境下,通過計(jì)算機(jī)標(biāo)準(zhǔn)串行RS-232接口與GPS模塊組成GPS定位信息采集、顯示、處理系統(tǒng)。該系統(tǒng)硬件設(shè)備接口簡單、軟件編程方便、系統(tǒng)可靠性好,為GPS的應(yīng)用提供了一個(gè)簡易途徑。
關(guān)鍵詞:GPS模塊串口通信距離方位角
0 引言
近年來,GPS系統(tǒng)已經(jīng)在大地測繪、海上漁用、車輛導(dǎo)航、精準(zhǔn)農(nóng)業(yè)等各個(gè)領(lǐng)域得到廣泛的應(yīng)用。目前,民用GPS設(shè)備包括精度可達(dá)毫米級(jí)的測量型接收機(jī)和定位精度為幾十米的導(dǎo)航型產(chǎn)品。除了GPS接收機(jī)整機(jī)產(chǎn)品外,市場上還有很多不同類型、價(jià)格低廉的GPS模塊產(chǎn)品。目前大多數(shù)GPS模塊產(chǎn)品都是通過RS232串口進(jìn)行數(shù)據(jù)傳輸?shù)摹_@些數(shù)據(jù)包括經(jīng)度、緯度、海拔高度、時(shí)間、衛(wèi)星使用情況等基本信息。開發(fā)人員只要配備以單片機(jī)控制、顯示設(shè)備或微機(jī)就可以完成整套的定位系統(tǒng)。
PC機(jī)的主要特點(diǎn)是具有較強(qiáng)的數(shù)據(jù)顯示、分析處理能力,很好的人機(jī)界面和大容量的存儲(chǔ)功能。因此通過串口實(shí)現(xiàn)通信,以PC機(jī)為控制器,以GPS模塊為終端設(shè)備的方式可構(gòu)成一GPS定位系統(tǒng)。
1 GPS簡介
本系統(tǒng)中使用的GPS系統(tǒng)標(biāo)準(zhǔn)是NMEA-0183標(biāo)準(zhǔn),NMEA 0183是美國國家海洋電子協(xié)會(huì)(National Marine Electronics Association )為海用電子設(shè)備于1983年制定的標(biāo)準(zhǔn)格式。此標(biāo)準(zhǔn)格式采用ASCII制定的,數(shù)據(jù)傳輸以語句的方式進(jìn)行,每個(gè)語句均以“$”開頭,然后是兩個(gè)字母的“識(shí)別符”和三個(gè)字母的“語句名”,接著就是以逗號(hào)分割的數(shù)據(jù)體,語句末尾未校驗(yàn)和,整條語句以回車換行符結(jié)束。
GPS模塊只要處于工作狀態(tài)就會(huì)源源不斷地把接收并計(jì)算出的GPS導(dǎo)航定位信息傳送到連接到它的嵌入式主板串口之上,在沒有進(jìn)一步處理之前,傳送的數(shù)據(jù)是一長串字節(jié)流信息。因此必須經(jīng)過程序?qū)⑵滢D(zhuǎn)化為有實(shí)際意義的,可供高層決策使用的定位信息數(shù)據(jù)。與其他通信協(xié)議類似,GPS模塊都遵循NMEA-0183協(xié)議,GPS進(jìn)行信息提取,必須明確其幀結(jié)構(gòu),然后才能根據(jù)其結(jié)構(gòu)完成對各個(gè)定位信息的提取。其發(fā)送到串口的數(shù)據(jù)主要由幀頭,幀尾和幀內(nèi)數(shù)據(jù)組成。根據(jù)數(shù)據(jù)幀的不同,幀頭也不相同,主要有“#GPGGA”,“$GPGSA”,“$GPRMC”等。這些幀頭標(biāo)識(shí)了后續(xù)幀內(nèi)數(shù)據(jù)的組成結(jié)構(gòu),各幀均以回車符和換行符作為幀尾標(biāo)識(shí)一幀的結(jié)束。對于通常的情況,大家所關(guān)心的定位數(shù)據(jù)如經(jīng)緯度、速度、時(shí)間、航向等均以“$GPRMC”中獲取得到。對于用戶的應(yīng)用程序來講,要讀取GPS模塊的定位數(shù)據(jù),無非是實(shí)現(xiàn)兩個(gè)簡單的步驟:①讀取串口數(shù)據(jù);②將讀取的數(shù)據(jù)解析出來。
2 基于C#下的串口通信實(shí)現(xiàn)
2.1 串口的讀取數(shù)據(jù)
我們以安裝了Winxp操作系統(tǒng)連接GPS模塊,用C#來實(shí)現(xiàn)讀取GPS模塊發(fā)過來的串口數(shù)據(jù),最方便的方法是直接使用VS提供的SerialPort串口類,這個(gè)串口類提供一個(gè)DataRecieved事件響應(yīng)機(jī)制,可以簡單方便地讀取串口數(shù)據(jù),如:
GPS 模塊默認(rèn)會(huì)每1秒向串口發(fā)送一條$GPRMC語句。因此,對 GPS 模塊不需要寫串口,只需要讀串口。GPS 模塊軟件部分的主要功能就是解析$GPRMC語句,獲得其中的有用數(shù)據(jù)。
收到的串口數(shù)據(jù)是標(biāo)準(zhǔn)的string字符串,以“$GPRMC”開頭的幀為例,收到的每一幀數(shù)據(jù)string都以回車換行符為結(jié)尾,可以以回車換行符為標(biāo)志將數(shù)據(jù)string提取出來;而且這個(gè)數(shù)據(jù)幀的每個(gè)元素均以逗號(hào)分隔,可以通過逗號(hào)分隔將這個(gè)數(shù)據(jù)幀的每個(gè)元素提取到一個(gè)string數(shù)組里面進(jìn)行進(jìn)一步處理。如:語句解析實(shí)現(xiàn)方法如下:
在update_data函數(shù)中,通過Split()函數(shù)將從串口獲得的數(shù)據(jù)分配到字符串?dāng)?shù)組中即可:
2.2 GPS定位信息的傳遞
在確定兩臺(tái)PC機(jī)的定位信息之后,就是如何將兩臺(tái)PC機(jī)的定位信息相互傳遞了。實(shí)現(xiàn)的方法有多種,最簡單的就是利用TCP/IP網(wǎng)絡(luò)協(xié)議來完成,也可采用GPRS網(wǎng)絡(luò)來實(shí)現(xiàn)。本系統(tǒng)采用的是GPRS模塊來實(shí)現(xiàn)兩臺(tái)PC之間的相互通信。
2.3 GPS定位信息的處理
在定位模塊中,系統(tǒng)需要不斷查詢GPS緩沖區(qū),來更新自己的定位數(shù)據(jù),這個(gè)功能由一個(gè)定時(shí)器實(shí)現(xiàn)。當(dāng)定時(shí)器中斷發(fā)生,首先觸發(fā)myserialPort1_DataReceived()事件,檢查自身的GPS模塊是否有可用的定位數(shù)據(jù)。如果有,則將GPS數(shù)據(jù)解析并放入GPS_info[]數(shù)組中;然后調(diào)用myserialPort_DataReceived()來查詢GPRS模塊是否已接收到了PC機(jī)的定位數(shù)據(jù),如果有,則將解析數(shù)據(jù)并放入GPS_info[] 對象中,并同時(shí)放入數(shù)據(jù)庫中。如果兩個(gè)對象都有效,更新界面上的定位信息,并計(jì)算當(dāng)前PC機(jī)和PC機(jī)原位置(已存入數(shù)據(jù)庫)兩個(gè)地點(diǎn)的距離和相對方向,如果兩點(diǎn)距離大于規(guī)定的長度,則報(bào)警,并進(jìn)入報(bào)警模式,如果距離合格,則退出報(bào)警模式。如果兩點(diǎn)都有效,根據(jù)兩點(diǎn)的經(jīng)緯度坐標(biāo),在谷歌地圖上顯示當(dāng)前位置,比例尺自適應(yīng)。
計(jì)算兩經(jīng)緯度之間的距離,就是已知球體半徑,計(jì)算兩點(diǎn)之間的球面距離。
公式:設(shè)A(α1,β1),B(α2,β2)為地球上不同緯度不同經(jīng)度的兩點(diǎn)(緯度分別為α1,α2,經(jīng)度分別為β1,β2,規(guī)定北緯時(shí)緯度為正,南緯時(shí)緯度為負(fù),東經(jīng)時(shí)經(jīng)度為正,西經(jīng)時(shí)經(jīng)度為負(fù))則A、B兩地的球面距離為:
s=R*arccos(sina1sina2+cosa1cosa2cos|β1β2|)(R為地球半徑)
根據(jù)這個(gè)公式,我們就能很輕松的計(jì)算出兩臺(tái)PC機(jī)之間的距離了。
3 結(jié)束語
通過本方法,可以將GPS定位導(dǎo)航信息從GPS接收機(jī)完整接收,并將所需信息從中提取,從而為實(shí)現(xiàn)飛行控制系統(tǒng)的導(dǎo)航控制提供數(shù)據(jù)采集。其實(shí),GPS接收并提取的數(shù)據(jù)也可以為其它應(yīng)用系統(tǒng)所應(yīng)用,如電子地圖、車載導(dǎo)航、智能交通、野外勘探等方面。只是在數(shù)據(jù)提取方面有所不同,經(jīng)過修改,完全可以應(yīng)用到其中。
參考文獻(xiàn):
[1]徐鑫,康波,呂炳朝,肖偉.電視技術(shù)[J].研究與開發(fā)2006(1)111-1114.
[2]王靖,紀(jì)元法,孫希延,伍建輝.桂林電子科技大學(xué)學(xué)報(bào)[J].2010[1]30-32.