《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > GPS船舶試航數(shù)據(jù)提取與存儲(chǔ)系統(tǒng)的開(kāi)發(fā)
GPS船舶試航數(shù)據(jù)提取與存儲(chǔ)系統(tǒng)的開(kāi)發(fā)
來(lái)源:微型機(jī)與應(yīng)用2013年第23期
徐涴砯,,陳 光,,高孟茹
(東華大學(xué) 信息科學(xué)與技術(shù)學(xué)院,,上海 201620)
摘要: 為了提高船舶試航測(cè)試系統(tǒng)定位數(shù)據(jù)的精確性與可靠性,同時(shí)適應(yīng)現(xiàn)代試航測(cè)試系統(tǒng)的整體性能要求,,開(kāi)發(fā)了一種基于GPS的船舶試航數(shù)據(jù)提取與存儲(chǔ)系統(tǒng)。建立了總體架構(gòu),,提出了基于多線程的GPS串口通信和SQL數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)處理改進(jìn)技術(shù),,開(kāi)發(fā)了軟件系統(tǒng)。通過(guò)測(cè)試,,證明新技術(shù)在提高試航定位數(shù)據(jù)性能方面效果顯著,,同時(shí)精度符合實(shí)際需求。
Abstract:
Key words :

摘  要: 為了提高船舶試航測(cè)試系統(tǒng)定位數(shù)據(jù)的精確性與可靠性,,同時(shí)適應(yīng)現(xiàn)代試航測(cè)試系統(tǒng)的整體性能要求,,開(kāi)發(fā)了一種基于GPS的船舶試航數(shù)據(jù)提取與存儲(chǔ)系統(tǒng)。建立了總體架構(gòu),,提出了基于多線程的GPS串口通信和SQL數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)處理改進(jìn)技術(shù),,開(kāi)發(fā)了軟件系統(tǒng)。通過(guò)測(cè)試,,證明新技術(shù)在提高試航定位數(shù)據(jù)性能方面效果顯著,,同時(shí)精度符合實(shí)際需求。
關(guān)鍵詞: 全球定位系統(tǒng),;串口通信,;多線程;微軟基礎(chǔ)類(lèi)編程;應(yīng)用程序編程接口

 船舶試航是新船出廠前的一個(gè)重要測(cè)試過(guò)程,,其目的在于測(cè)試船舶的航行性能,,并對(duì)船舶設(shè)計(jì)方的設(shè)計(jì)做出評(píng)價(jià),同時(shí)這些船舶實(shí)際航行的測(cè)試資料,,可以為設(shè)計(jì)方設(shè)計(jì)新船舶時(shí)提供參考,。
 船舶試航大部分采用GPS獲取船舶的定位數(shù)據(jù),由計(jì)程儀,、羅經(jīng)等相關(guān)設(shè)備記錄參數(shù),,然后通過(guò)計(jì)算和繪制航跡曲線獲得船舶性能。傳統(tǒng)試航作業(yè)中,,一般通過(guò)手工和計(jì)算機(jī)輔助設(shè)備獲得數(shù)據(jù),,人工干預(yù)度高,難以有效獲得精確度高的數(shù)據(jù),,已無(wú)法滿足現(xiàn)代試航系統(tǒng)的數(shù)據(jù)性能要求,。
 目前船廠所用的船舶試航系統(tǒng)軟件大多工作在DOS界面上,存在穩(wěn)定性差,、數(shù)據(jù)安全性弱,、移植性差以及人機(jī)交互不夠友好等問(wèn)題。為克服DOS系統(tǒng)帶來(lái)的不便,,2001年華南理工大學(xué)開(kāi)發(fā)了一套基于VB開(kāi)發(fā)的GPS船舶測(cè)試系統(tǒng),,整個(gè)系統(tǒng)雖然結(jié)構(gòu)較為清晰,但由于VB本身特點(diǎn),,對(duì)數(shù)據(jù)處理性能以及系統(tǒng)穩(wěn)定性有著一定的局限性,。2006年,上海海事大學(xué)發(fā)表了一篇題為《基于GPS的船舶航行試驗(yàn)系統(tǒng)研究》的論文,,在VC++平臺(tái)上,,應(yīng)用GPS技術(shù)、計(jì)算機(jī)處理技術(shù)設(shè)計(jì)了一套完整的試航測(cè)試系統(tǒng),,增強(qiáng)了系統(tǒng)穩(wěn)定性,,但仍然存在數(shù)據(jù)接收和不能進(jìn)行同步處理的問(wèn)題。
 為改善已有試航數(shù)據(jù)系統(tǒng)功能,,有效提高數(shù)據(jù)穩(wěn)定性與可靠性,,本文在VC++平臺(tái)上,通過(guò)多線程技術(shù)以及數(shù)據(jù)提取方式的優(yōu)化,,提出一個(gè)新的GPS船舶試航數(shù)據(jù)處理系統(tǒng),。系統(tǒng)的主要優(yōu)勢(shì)在于實(shí)時(shí)有效地接收處理GPS定位數(shù)據(jù),提高數(shù)據(jù)精度,,并結(jié)合SQL數(shù)據(jù)庫(kù)技術(shù)安全存儲(chǔ),。
1 系統(tǒng)組成
 GPS船舶試航數(shù)據(jù)提取與存儲(chǔ)系統(tǒng)是GPS船舶試航系統(tǒng)的數(shù)據(jù)接收,、處理、存儲(chǔ)部分,,主要由兩大部分組成,,如圖1所示。其中,,GPS串口通信部分主要是對(duì)GPS接收機(jī)中接收到的船舶的衛(wèi)星定位數(shù)據(jù)進(jìn)行提取處理,;數(shù)據(jù)庫(kù)存儲(chǔ)部分將提取處理后的有用數(shù)據(jù)按照一定的格式存儲(chǔ)入數(shù)據(jù)庫(kù)以供后期使用。

2 GPS串口通信
 GPS接收機(jī)通過(guò)串口與PC機(jī)相連,,將GPS定位數(shù)據(jù)傳輸?shù)絇C機(jī),,作為整個(gè)系統(tǒng)的數(shù)據(jù)源,。由于本系統(tǒng)工作在現(xiàn)場(chǎng),,需要滿足實(shí)時(shí)穩(wěn)定的通信需求,并保證接收到的GPS數(shù)據(jù)的有效性與完整性,。為此,,本文采用基于多線程的串口通信技術(shù),能做到在接收定位數(shù)據(jù)的同時(shí),,對(duì)其進(jìn)行提取處理,。
2.1 串口通信編程
 GPS串口通信的開(kāi)發(fā)模式通常有Windows API、串口通信組件MSComm及第三方串口通信類(lèi),。
 其中,,MSComm控件雖然編程簡(jiǎn)單,但是由于進(jìn)行了大量封裝,,其編程的靈活性,、穩(wěn)定性、可控性較差,;第三方串口通信類(lèi)是個(gè)介于WinAPI與MScomm控件之間的方式,,有一定的封裝性,但相對(duì)靈活可控,,唯一的缺陷在于移植性要遜于API函數(shù),。新船試航系統(tǒng)需要一個(gè)能滿足較高精度,工作在現(xiàn)場(chǎng),,并且可以根據(jù)需要適應(yīng)各種設(shè)備的數(shù)據(jù)提取與存儲(chǔ)系統(tǒng),。同時(shí)API函數(shù)法作為與計(jì)算機(jī)底層設(shè)備聯(lián)系最為緊密的一種實(shí)現(xiàn)方法,與MSComm控件和第三方通信類(lèi)相比,,應(yīng)用于多線程系統(tǒng)時(shí)有更好的穩(wěn)定性,。因而API函數(shù)法能更好滿足試航系統(tǒng)需求,故本文采用API函數(shù)法來(lái)實(shí)現(xiàn)串口通信,。
2.2 多線程編程
 Windows多線程編程可以使用兩種方法:直接使用Win32 API或MFC線程技術(shù),。其中MFC編程較為簡(jiǎn)便,更方便實(shí)現(xiàn)界面線程。在MFC線程技術(shù)中,,線程分為用戶界面線程和工作者線程,。用戶界面線程有自己的消息隊(duì)列和消息循環(huán)來(lái)處理界面消息,用來(lái)與用戶進(jìn)行交互,;工作者線程沒(méi)有消息循環(huán),,一般用來(lái)完成后臺(tái)工作。
 結(jié)合實(shí)際需要以及編程的難易程度,,本文選擇MFC線程技術(shù)實(shí)現(xiàn)多線程,。
2.3 多線程串口通信的實(shí)現(xiàn)
 串口通信部分分為數(shù)據(jù)處理與數(shù)據(jù)接收兩大部分。數(shù)據(jù)處理主線程CDataFlow,,用于對(duì)接收到的數(shù)據(jù)提取處理,;數(shù)據(jù)接收工作線程CThreadCom,用于監(jiān)視串口狀態(tài)以及對(duì)GPS數(shù)據(jù)的接收,。其中用WaitCommEvent函數(shù)對(duì)串口進(jìn)行監(jiān)視,,一旦有數(shù)據(jù)到達(dá),即可讀取進(jìn)緩存區(qū),,從而增加了數(shù)據(jù)的實(shí)時(shí)性,。數(shù)據(jù)接收與數(shù)據(jù)處理兩個(gè)線程的流程如圖2所示。

 從圖中可以看到,,接收到的數(shù)據(jù)將從緩沖區(qū)中讀出并存儲(chǔ)在緩存數(shù)據(jù)文件中,,這樣既可以不必考慮數(shù)據(jù)處理速度對(duì)于數(shù)據(jù)接收所造成的影響,也不會(huì)造成丟失數(shù)據(jù)幀,,在數(shù)據(jù)實(shí)時(shí)接收的同時(shí),,保證了數(shù)據(jù)接收的完整性。下面分別說(shuō)明數(shù)據(jù)處理主線程與數(shù)據(jù)接收線程的具體實(shí)現(xiàn),。
?。?)GPS數(shù)據(jù)格式
 在說(shuō)明如何實(shí)現(xiàn)數(shù)據(jù)接收之前,本文先討論一下GPS接收機(jī)的數(shù)據(jù)接收格式,。GPS數(shù)據(jù)遵循NMEA0183協(xié)議,,該協(xié)議主要用來(lái)傳輸GPS定位信息,衛(wèi)星信息,、經(jīng)緯度信息,、速度、時(shí)間等信息,,輸出標(biāo)準(zhǔn)ASCII碼形式的數(shù)據(jù)信息,,協(xié)議包括GPGGA、GPGSA,、GPRMC,、GPGLL等多種數(shù)據(jù)格式,,數(shù)據(jù)格式都以“$”開(kāi)頭,到*表示校驗(yàn)碼開(kāi)始,,hh表示語(yǔ)句校驗(yàn)碼,,本文需要提取GPGGA與GPRMC中的信息。
?。?)數(shù)據(jù)接收
 針對(duì)實(shí)時(shí)接收數(shù)據(jù)的要求,,本文使用WaitCommEvent()對(duì)串口數(shù)據(jù)進(jìn)行接收。在API函數(shù)中,,WaitCommEvent(),、WaitForMultipleObject()和GetOverlappedResult()等函數(shù)均可以檢測(cè)到串口是否有數(shù)據(jù)。其中waitforMultipleobjects()作用為等待多個(gè)被監(jiān)測(cè)內(nèi)核對(duì)象的結(jié)果,,getoverlappedresult()為返回最后重疊操作結(jié)果,。相比之下,waitcommevent()是一個(gè)特指的通信設(shè)備等待一個(gè)事件發(fā)生,,并監(jiān)控與該設(shè)備句柄相關(guān)聯(lián)的一系列事件,。用該函數(shù)接收數(shù)據(jù)時(shí),一旦數(shù)據(jù)到達(dá)串口,,系統(tǒng)將會(huì)馬上檢測(cè)到,并做好接收的準(zhǔn)備,,其關(guān)鍵實(shí)現(xiàn)代碼如下:
 While(m_hcom!=INVALID_HANDLE_VALUE)
 {dwEvent=0
 WaitCommEvent(m_hCom,,&dwEvent,Null),;
 //檢查串口事件
 If((dwEvent&EV_RXCHAR)==EV_RXCHAR)
 //如果發(fā)現(xiàn)有串口數(shù)據(jù)接收事件,,接收數(shù)據(jù)
 {do//循環(huán)接收串口數(shù)據(jù)
 {if(nLength=ReceiveData((LPSTR)rBuf,
 MAX_COM_IN_LENGTH))//
 {if(dwEVENT&~EV_RXCHAR)
 //如果串口數(shù)據(jù)中有字符接收事件,,
 //則將事件傳送CDataFlow進(jìn)行處理
 {if(m_pWndData)
 {m_pWndData->SendMessage(m_dwMsgToData,,dwEvent,0),;}}}
 If(nLength)//接收到數(shù)據(jù)傳給CDataFlow處理
 {if(m_pWndData)
 {m_pWndData->SengMessage(m_dwMsgToData,,(DWORD)rBuf,nLength),;}}
 }while(nLength>0),;}sleep(1);}sleep(1),;}
?。?)GPS數(shù)據(jù)處理
 作為串口通信的主線程,數(shù)據(jù)處理主要功能是在緩存區(qū)中將GPGGA與GPRMC數(shù)據(jù)取出,,通過(guò)數(shù)據(jù)提取函數(shù)DealFlow提取數(shù)據(jù)包,,進(jìn)行校驗(yàn)處理后,,發(fā)送消息給解碼函數(shù)OnDecodeMsg進(jìn)行協(xié)議解析:先將有用NMEA數(shù)據(jù)提取,分割成數(shù)組,,隨后對(duì)數(shù)組進(jìn)行操作,,得到需要的數(shù)據(jù)信息。這種先檢驗(yàn)后分割再提取的處理方法有助于提高數(shù)據(jù)質(zhì)量,。流程圖如圖2所示,,下面以GPGGA解碼為例,給出關(guān)鍵代碼與說(shuō)明:
for(itemCount=1,;itemCount<total,;itemCount++)
{iLen=0//設(shè)置每項(xiàng)從數(shù)據(jù)的第一個(gè)字符開(kāi)始處理
CString*item=m_dataArray.GetAt(itemCount);//
Switch(itemCount)//
{case1:itemLen=2,;
CGPSPublic::ConverToInt((int&)pack-
>GPS_NMEA_GPGGA.body.time.hour,,
item->Mid(iLen,itemLen)),;//
CGPSPublic::ConverToInt((int&)pack->
GPS_NMEA_GPGGA.body.time.minute,,
item->Mid(iLen,itemLen)),;//
CGPSPublic::ConverToInt((int&)pack->
GPS_NMEA_GPGGA.body.time.second,,
item->Mid(iLen,itemLen)),;//break,;
case2:CGPSPublic::ConverToLatitudeHavePoint(
(double&)pack->GPS_NMEA_GPGGA.body.latitude.lati
tude,*item),;//break,;
case3:itemLen=1;
CGPSPublic::ConverToChar((char&)pack->
GPS_NMEA_GPGGA.bady.latitudetype,,
*item->Mid(iLen,,itemLen),itemLen),;break,;
……
 值得一提的是,在數(shù)據(jù)提取與校驗(yàn)實(shí)現(xiàn)算法中,,對(duì)字符串操作的函數(shù)必不可少,,本文主要通過(guò)使用以下幾個(gè)主要函數(shù)對(duì)字符串操作:
 (1)Find()函數(shù)
 該函數(shù)用于查找指定目標(biāo)第一次出現(xiàn)在字符串中位置,,如果不存在即返回值-1,。Find函數(shù)在數(shù)據(jù)截取算法中主要用于查找回車(chē)符,以及NMEA-0183協(xié)議中的逗號(hào),,返回的位置參數(shù)對(duì)后面Delete函數(shù)的應(yīng)用起到重要的作用,。
?。?)Delete()函數(shù)
 該函數(shù)用于刪除字符串中無(wú)用的內(nèi)容,Delete()函數(shù)包括2個(gè)基本參數(shù),,即起始位置和終點(diǎn)位置,,函數(shù)將刪除之間的內(nèi)容。
?。?)Compare()函數(shù)
 該函數(shù)用于比較字符串與目標(biāo)字符串之間區(qū)別,,可以有效地在包含大量信息的字符串中篩選出有用信息。如果字符串與目標(biāo)字符串相同,,則返回值為0,,不相同則返回值不為0。
3 數(shù)據(jù)庫(kù)存儲(chǔ)

 


 船舶試航定位信息數(shù)據(jù)庫(kù)作為后臺(tái)數(shù)據(jù)庫(kù),,不僅要提供一種可靠的數(shù)據(jù)存儲(chǔ),,作為定位數(shù)據(jù)信息的容器,同時(shí)還需有效地管理其中數(shù)據(jù)信息,,并提供高效的數(shù)據(jù)訪問(wèn)和恢復(fù)機(jī)制,。下面將通過(guò)數(shù)據(jù)表的設(shè)計(jì)與ODBC數(shù)據(jù)庫(kù)互聯(lián)兩個(gè)部分來(lái)說(shuō)明如何實(shí)現(xiàn)高效可靠的數(shù)據(jù)存儲(chǔ)。
?。?)SQL Server數(shù)據(jù)庫(kù)配置與數(shù)據(jù)表設(shè)計(jì)
 在安裝和完成SQL Server本地配置之后,,需要新建一個(gè)數(shù)據(jù)庫(kù),并添加一張表用于儲(chǔ)存數(shù)據(jù),。本系統(tǒng)需要儲(chǔ)存的參數(shù)是經(jīng)度,、緯度、速率,、航向這4個(gè)數(shù)據(jù),因此在數(shù)據(jù)庫(kù)的列設(shè)置中,,需要添加這4個(gè)名稱(chēng),,并且設(shè)置字符類(lèi)型。由于速率和航向在位移很小時(shí),,不會(huì)顯示數(shù)據(jù),,為了避免之后編譯中出錯(cuò),應(yīng)允許數(shù)據(jù)為NULL值,。由于GPS接收機(jī)接收到的經(jīng)緯度坐標(biāo)最大長(zhǎng)度不超過(guò)10位,,因而字符類(lèi)型設(shè)置為nchar(10)。
?。?)ODBC數(shù)據(jù)庫(kù)互聯(lián)
 開(kāi)放數(shù)據(jù)庫(kù)互聯(lián)是微軟公司開(kāi)放服務(wù)結(jié)構(gòu)中有關(guān)數(shù)據(jù)庫(kù)的一個(gè)組成部分,,它建立了一組規(guī)范,并提供了一組對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的標(biāo)準(zhǔn)API,。這些API利用SQL來(lái)完成其大部分任務(wù),。ODBC本身也提供了對(duì)SQL語(yǔ)言的支持,,用戶可以直接將SQL語(yǔ)句送給ODBC。
 定位信息數(shù)據(jù)庫(kù)需要完成的主要任務(wù)是:數(shù)據(jù)動(dòng)態(tài)存儲(chǔ),、數(shù)據(jù)表操作和數(shù)據(jù)調(diào)用,,其中用到的VC++中MFC基類(lèi)庫(kù)定義了3個(gè)數(shù)據(jù)庫(kù)類(lèi),CDatabase(數(shù)據(jù)庫(kù)類(lèi)):對(duì)象提供數(shù)據(jù)源連接,、CRecordSet(記錄集類(lèi)):對(duì)象提供數(shù)據(jù)源動(dòng)態(tài)行集方式的記錄集以及CRecordView(可視記錄集類(lèi)):對(duì)象以控制的形式顯示數(shù)據(jù)庫(kù)記錄,。
 在VS2010中關(guān)聯(lián)數(shù)據(jù)庫(kù)需要添加MFCODBC使用者這個(gè)類(lèi),在設(shè)置完成類(lèi)MFCODBC使用者之后,,程序會(huì)自動(dòng)添加兩個(gè)文件,,分別是Table_1.h和Table_1.cpp(Table_1是數(shù)據(jù)庫(kù)中設(shè)置的表的名稱(chēng)),并生成一個(gè)CTable_1的類(lèi),,通過(guò)這個(gè)類(lèi),,可以定義數(shù)據(jù)庫(kù)指針,即:Ctable_1 m_pSet,。在VC++中,,通過(guò)這個(gè)指針可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)添加、刪除,、查找等功能,,也可以通過(guò)“.”運(yùn)算代碼進(jìn)行定位和賦值。在添加新記錄后,,需要使用Updata()函數(shù)將緩存中保存的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)中,,從而完成數(shù)據(jù)庫(kù)的儲(chǔ)存。同樣,,數(shù)據(jù)讀取功能也可以通過(guò)對(duì)指針的操作完成,。圖3為數(shù)據(jù)存入情況。

 本文在VC++6.0環(huán)境下,,結(jié)合SQL Server技術(shù),,對(duì)GPS定位數(shù)據(jù)進(jìn)行接收與提取,并存入數(shù)據(jù)庫(kù)中,,以供GPS船舶試航作為基礎(chǔ)數(shù)據(jù),。其中,串口通信部分不僅利用了多線程技術(shù),,將數(shù)據(jù)接收與數(shù)據(jù)處理分開(kāi),,有效地提高了數(shù)據(jù)的處理能力;同時(shí)在數(shù)據(jù)處理時(shí),,還通過(guò)對(duì)數(shù)據(jù)包進(jìn)行預(yù)處理,,剔除接收中可能產(chǎn)生的掉幀數(shù)據(jù),繼而將NMEA語(yǔ)句分割,,存入數(shù)組,,并對(duì)數(shù)組進(jìn)行相應(yīng)解碼,,實(shí)現(xiàn)了在提高效率的同時(shí)減少出錯(cuò)的幾率。最后將解析后的數(shù)據(jù)自動(dòng)存入數(shù)據(jù)庫(kù),,供GPS船舶試航系統(tǒng)作為基礎(chǔ)數(shù)據(jù),。
作為GPS新船舶試航系統(tǒng)的數(shù)據(jù)源,本系統(tǒng)已通過(guò)測(cè)試,,其精度符合船廠要求,,操作界面友好,現(xiàn)場(chǎng)運(yùn)行效果良好,。
參考文獻(xiàn)
[1] 徐志京,,許開(kāi)宇,胡文燁.基于GPS的船舶航行試驗(yàn)系統(tǒng)研究[C].大連:中國(guó)航海學(xué)會(huì)通信導(dǎo)航專(zhuān)業(yè)委員會(huì)2006年學(xué)術(shù)年會(huì)論文集,,大連海事大學(xué)出版社,,2006.
[2] 李莉.GPS接收機(jī)串口通信的MSComm和API實(shí)現(xiàn)[J].中國(guó)新通信,2010(6):81-84.
[3] 陳凱,,鄧明,,張啟升,等.Windows CE下多線程串口通信[J].微計(jì)算機(jī)信息,,2007,,23(10-2).
[4] 劉書(shū)智.Visual C++串口通信與工程應(yīng)用實(shí)踐[M].北京:中國(guó)鐵道出版社,2011.
[5] 劉夏.基于VB的GPS定位算法與軟件實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程,,2013(2):208-211.
[6] 劉巖,,汪劍云,吳北平,,等.基于VB.NET的GPs接收機(jī)串口通信的實(shí)現(xiàn)[J].地理空間信息,,2012,10(2):47-49.
[7] 李冰,,曾連蓀.GPS定位信息提取及應(yīng)用[J].電子設(shè)計(jì)工程,,2012,20(12):72-74.
[8] 沈振漢,,黃華燦.PC機(jī)與GPS接收機(jī)的通訊程序設(shè)計(jì)與實(shí)現(xiàn)[J].華僑大學(xué)學(xué)報(bào)(自然科學(xué)版),2011.32(1):118-120.
[9] 王靖,,紀(jì)元法,,孫希延,等.高動(dòng)態(tài)GPS信號(hào)模擬器中串口通信的實(shí)現(xiàn)[J].桂林電子科技大學(xué)學(xué)報(bào),,2010,,30(1):30-32.
[10] 陽(yáng)世榮.基于Keil與VSPD軟件仿真的串口通信調(diào)試技術(shù)[J].艦船電子工程,2010,,30(1):30-32.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。