雷 娟,劉文霞
(天津開發(fā)區(qū)職業(yè)技術(shù)學(xué)院電子信息系,天津 300457)
GPS數(shù)據(jù)采集分析器軟件的開發(fā)建立在對(duì)GPS數(shù)據(jù)深入解析的基礎(chǔ)上。GPS數(shù)據(jù)采集分析器上位機(jī)軟件通過計(jì)算機(jī)串口與GPS接收機(jī)進(jìn)行連接,將采集的GPS數(shù)據(jù)存儲(chǔ)在文件中,并要求軟件能夠以讀取串口數(shù)據(jù)和讀取GPS數(shù)據(jù)文件兩種方式工作,在GPS數(shù)據(jù)采集的基礎(chǔ)上獲取一條完整的GPS數(shù)據(jù)信息,依照NMEA[1]及UBX協(xié)議所規(guī)定的GPS數(shù)據(jù)格式對(duì)其進(jìn)行語句分析,獲得其中的定位信息、可視衛(wèi)星信息等,并將解析得到的數(shù)據(jù)以運(yùn)行軌跡圖、衛(wèi)星信噪圖和星圖的方式展示出來。
設(shè)計(jì)并實(shí)現(xiàn)上位機(jī)軟件GPS數(shù)據(jù)采集分析器,主要實(shí)現(xiàn)以下功能:(1)對(duì)串口接收的GPS定位及星圖數(shù)據(jù)解析。(2)對(duì)GPS數(shù)據(jù)存儲(chǔ)。(3)對(duì)運(yùn)行軌跡圖像化顯示。(4)對(duì)星圖的圖像化顯示。(5)對(duì)采集回放功能。
軟件運(yùn)行在使用Windows系列平臺(tái)的計(jì)算機(jī)上,通過計(jì)算機(jī)串口讀取AIS M4501輸出的GPS數(shù)據(jù)。硬件連接如圖1所示。
圖1 硬件連接圖
編程語言:VC++[2-4]和 MFC。
編程環(huán)境:Windows系列平臺(tái),VC6.0編譯環(huán)境。
軟件總體架構(gòu)如圖2所示,軟件分為GPS數(shù)據(jù)采集存儲(chǔ)模塊、GPS數(shù)據(jù)解析模塊和繪圖模塊3大部分,GPS數(shù)據(jù)采集存儲(chǔ)模塊為GPS數(shù)據(jù)解析模塊提供所要解析的GPS數(shù)據(jù),GPS數(shù)據(jù)采集模塊作為軟件的核心部分實(shí)現(xiàn)對(duì)GPS數(shù)據(jù)的解析功能,繪圖模塊根據(jù)解析后的數(shù)據(jù)繪制相應(yīng)的運(yùn)行軌跡圖、星圖和衛(wèi)星信噪比圖。
圖2 軟件總體架構(gòu)
GPS數(shù)據(jù)采集分析器可以工作在正常模式和采集回放模式下。在正常模式下,軟件讀取并解析處理所連接的串口數(shù)據(jù),并將解析后的數(shù)據(jù)圖形化顯示;在采集回放模式下,軟件讀取用戶指定文件中的GPS數(shù)據(jù),并按幀解析數(shù)據(jù)及圖形化顯示。圖3描述了軟件基本運(yùn)行流程,數(shù)據(jù)采集存儲(chǔ)模塊負(fù)責(zé)采集串口數(shù)據(jù)和文件中的GPS數(shù)據(jù),并將數(shù)據(jù)發(fā)送到數(shù)據(jù)解析模塊進(jìn)行處理,處理后的數(shù)據(jù)發(fā)送到繪圖模塊用于運(yùn)行軌跡圖、可視衛(wèi)星圖和衛(wèi)星信噪圖的圖形化顯示。
圖3 軟件運(yùn)行流程
軟件的主要類的設(shè)計(jì)及相互關(guān)系如圖4所示,軟件核心部分主要由CMainFrame、GPSParser兩個(gè)類實(shí)現(xiàn),其中CMainFrame類是主窗口類,控制程序的運(yùn)行過程,其中包含了GPS數(shù)據(jù)信息,并定義了GPSParser類的實(shí)例。GPSParser類用于解析GPS數(shù)據(jù),其中涉及到可視衛(wèi)星的表示,使用 Satellite來描述。另外GPSTrackView、GPSSatelliteView、GPSSNRView、GPSInfoView、GPSStrView類分別用來顯示運(yùn)行軌跡圖、可視衛(wèi)星圖、衛(wèi)星信噪圖、GPS信息以及GPS字符串。
在VC6.0環(huán)境下編寫程序,并通過單步調(diào)試和代碼走讀調(diào)試通過。遇到的問題及解決方法:
(1)串口數(shù)據(jù)和文件數(shù)據(jù)統(tǒng)一化處理問題。軟件工程要求盡量減少冗余代碼,盡可能進(jìn)行代碼復(fù)用,因此軟件設(shè)計(jì)時(shí)確定將串口數(shù)據(jù)和文件中讀取的數(shù)據(jù)進(jìn)行統(tǒng)一處理。但是在實(shí)際情況下,從文件中讀取數(shù)據(jù)可以一次性處理完畢,但串口數(shù)據(jù)是實(shí)時(shí)的,只能實(shí)時(shí)處理。這就使得兩種方式在處理上必然存在不同。為能采用盡量統(tǒng)一的方式處理數(shù)據(jù),為解析器的解析函數(shù)添加一個(gè)表示工作模式的參數(shù),在解析函數(shù)內(nèi)部根據(jù)工作模式的不同在必要之處進(jìn)行區(qū)分處理,實(shí)現(xiàn)統(tǒng)一的功能。具體實(shí)現(xiàn)方法是:在采集回放模式下一次處理一幀GPS數(shù)據(jù),解析完成后調(diào)用繪圖函數(shù)圖形化顯示;在正常模式下,實(shí)時(shí)解析GPS數(shù)據(jù),每解析完成一句有用的GPS語句都調(diào)用繪圖函數(shù)刷新顯示。通過這種方式,控制代碼只需將工作模式作為參數(shù)傳遞給解析器,就可以實(shí)現(xiàn)統(tǒng)一化處理。
(2)運(yùn)行軌跡圖實(shí)現(xiàn)。1)定位點(diǎn)的繪制。根據(jù)經(jīng)度和緯度信息繪制表示位置的點(diǎn),首先要確定繪圖窗口所表示的區(qū)域,然后根據(jù)定位點(diǎn)與繪圖區(qū)域的相對(duì)位置,計(jì)算確定點(diǎn)在屏幕上的坐標(biāo),然后將點(diǎn)顯示出來。2)圖像放大、縮小與拖拽操作。為能實(shí)現(xiàn)圖像的放大縮小與拖拽操作,定義了一個(gè)結(jié)構(gòu)體變量,用來記錄當(dāng)前顯示區(qū)域中心位置所表示的實(shí)際經(jīng)緯度信息,并分別定義了X方向放大系數(shù)xcoef和Y方向放大系數(shù)ycoef,當(dāng)圖像放大或縮小時(shí),xcoef和ycoef產(chǎn)生變化,此時(shí)區(qū)域中心表示位置不變,運(yùn)行軌跡上的各個(gè)點(diǎn)需要根據(jù)其所表示的定位點(diǎn)與中心點(diǎn)的相對(duì)位置重新計(jì)算在繪圖區(qū)的坐標(biāo),刷新繪圖區(qū)域重新繪制從而實(shí)現(xiàn)圖像的放大縮小。由于繪圖區(qū)域的所有軌跡點(diǎn)都是相對(duì)于中心點(diǎn)計(jì)算得到的,因此當(dāng)使用鼠標(biāo)左鍵拖拽圖像時(shí),只需要計(jì)算出新的中心點(diǎn)所表示的經(jīng)緯度即可。
軟件需要從串口讀取GPS數(shù)據(jù)并進(jìn)行解析和圖像化顯示運(yùn)行軌跡圖、可視衛(wèi)星圖及衛(wèi)星信噪圖。由于串口數(shù)據(jù)是連續(xù)的GPS幀數(shù)據(jù),因此,當(dāng)?shù)玫叫碌腉PS幀數(shù)據(jù)后需要將原來顯示的圖像擦除然后繪制新的圖像。最簡(jiǎn)單的方法就是當(dāng)?shù)玫叫聰?shù)據(jù)時(shí),使用背景色的畫刷繪制繪圖窗口,然后再繪制新圖像。但在調(diào)試過程中發(fā)現(xiàn)采用這種方式繪圖會(huì)產(chǎn)生嚴(yán)重的屏幕閃爍。經(jīng)過資料查找和程序調(diào)試最終確定了采用分別繪制背景和圖像并只刷新圖像的方式解決這一問題。具體的實(shí)現(xiàn)方法是:背景繪制函數(shù)負(fù)責(zé)繪制背景色及底圖,圖像繪制函數(shù)負(fù)責(zé)使用指定的畫筆和特定的字體顏色繪制衛(wèi)星和信噪。在窗口初始化和發(fā)生重繪事件時(shí)繪制背景,當(dāng)?shù)玫叫翯PS數(shù)據(jù)時(shí),首先使用反色畫筆繪制舊圖像,達(dá)到圖像擦除的效果,然后使用普通畫筆繪制新圖像。經(jīng)過試驗(yàn),采用這種方式可以明顯減少屏幕的閃爍。
圖4 主要類的設(shè)計(jì)
軟件的人機(jī)交互盡量友好,其中主要包括兩部分:一是軟件界面友好,二是軟件操作友好[5]。在運(yùn)行軌跡的圖像化顯示中既要讓用戶有一個(gè)整體的位置概念,又要能夠顯示出小范圍內(nèi)的運(yùn)動(dòng),這就要求能夠放大和縮小運(yùn)行軌跡圖像。在初始狀態(tài)下,運(yùn)行軌跡圖顯示整個(gè)世界地圖,用戶可以通過放大縮小來顯示所關(guān)心的特定的區(qū)域。通常情況下圖像的放大縮小操作是通過鼠標(biāo)滾輪來實(shí)現(xiàn),但是采用鼠標(biāo)滾輪來實(shí)現(xiàn)放大時(shí)不能一次放大較大的倍數(shù),否則容易將用戶所關(guān)心的區(qū)域移到顯示區(qū)域之外,這種情況下將會(huì)影響用戶對(duì)軟件的印象。因此本軟件設(shè)計(jì)的放大縮小方案為使用鼠標(biāo)滾輪微調(diào)放大倍數(shù),通過雙擊鼠標(biāo)左鍵/右鍵來實(shí)現(xiàn)大范圍的放大倍數(shù)變更。經(jīng)過調(diào)試,最終確定當(dāng)顯示比例約為20/800時(shí)就可以表示小范圍的運(yùn)動(dòng),因此,設(shè)定每次單擊鼠標(biāo)右鍵時(shí)增大放大系數(shù)2 000,以方便用戶操作。
軟件在編寫過程中用到了VC++[2-4]控件CMSComm,該控件是ActiveX控件,需要加載mscomm32.ocx文件并對(duì)控件進(jìn)行注冊(cè)才可使用。在沒有安裝過VC6.0的計(jì)算機(jī)上程序運(yùn)行時(shí)不能成功創(chuàng)建控件的實(shí)例,導(dǎo)致運(yùn)行出錯(cuò)。解決這一問題的方法是在創(chuàng)建控件實(shí)例失敗時(shí),加載并注冊(cè)mscomm32.ocx文件,并將控件信息添加到注冊(cè)表中,然后重新創(chuàng)建控件實(shí)例。為防止目標(biāo)計(jì)算機(jī)上沒有mscomm32.ocx文件而導(dǎo)致加在注冊(cè)失敗,需要將mscomm32.ocx文件與程序可執(zhí)行文件放到同一文件夾下。另外在調(diào)試過程中還發(fā)現(xiàn),在一些計(jì)算機(jī)上由于缺少M(fèi)FC相關(guān)的動(dòng)態(tài)鏈接庫而導(dǎo)致程序無法運(yùn)行,將MFC42D.DLL、MFCO42D.DLL和MSVCRTD.DLL文件同樣放到程序可執(zhí)行文件所在文件夾下,可以解決這一問題。
按照硬件連接圖連接電腦、M4501主機(jī)和天線,測(cè)試程序的各項(xiàng)功能是否正常。按照?qǐng)D1所示連接設(shè)備,在計(jì)算機(jī)上運(yùn)行軟件,通過菜單項(xiàng)設(shè)置連接串口COM1,使用設(shè)置串口波特率為 38 400 bit·s-1。此時(shí),軟件能夠圖形化顯示當(dāng)前GPS信息。運(yùn)行軌跡圖顯示如圖5所示,圖中使用圓圈和圓點(diǎn)標(biāo)出了當(dāng)前位置。
圖5 運(yùn)行軌跡圖
可視衛(wèi)星星圖顯示如圖6所示,當(dāng)前共11顆可視衛(wèi)星,其中定位衛(wèi)星,分別以編號(hào) 27、11、19、32、20、8、7表示;信噪為0的衛(wèi)星,以編號(hào)17、28、24表示;未使用的可用衛(wèi)星,以編號(hào)4表示。
圖6 可視衛(wèi)星圖
衛(wèi)星信噪圖如圖7所示,與圖6相對(duì)應(yīng),分別顯示了11顆衛(wèi)星的信噪比信息。
圖7 衛(wèi)星信噪圖
圖8主要顯示的是定位信息和方向速度等信息,當(dāng)前位置為北緯 39.154 069°,東經(jīng) 117.206 053°,由于GPS接收機(jī)靜止,并且GPS數(shù)據(jù)存在誤差,導(dǎo)致速度在0附近小范圍波動(dòng)。
圖8 文字信息顯示
介紹了GPS數(shù)據(jù)采集分析器設(shè)計(jì)過程,相比硬件實(shí)現(xiàn)的GPS數(shù)據(jù)采集分析,軟件設(shè)計(jì)充分發(fā)揮了其軟件的靈活性,完成的樣機(jī)和設(shè)計(jì)文件均符合產(chǎn)品設(shè)計(jì)輸入的要求。
[1]曹婷婷,高玉.GPS中NMEA-0183協(xié)議的應(yīng)用[J].電子工程師,2006,32(10):8 -10.
[2]段智毅.Visual C++程序設(shè)計(jì)教程[M].北京:人民郵電出版社,2009.
[3]丁有和,鄭阿奇.Visual C++應(yīng)用教程[M].北京:人民郵電出版社,2008.
[4]馬飛,諸昌鈐.利用VC++實(shí)現(xiàn)GPS數(shù)據(jù)采集[J].計(jì)算機(jī)時(shí)代,2005,15(6):13 -15.
[5]袁會(huì)東,韓峻峰,潘盛輝,等.基于WinCE的GPS數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2012,35(19):165 -167.