版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
VC++實現(xiàn)GPS全球定位系統(tǒng)定位數(shù)據(jù)的提取VC++實現(xiàn)GPS全球定位系統(tǒng)定位數(shù)據(jù)的提取/NUMPAGES11VC++實現(xiàn)GPS全球定位系統(tǒng)定位數(shù)據(jù)的提取VC++實現(xiàn)GPS全球定位系統(tǒng)定位數(shù)據(jù)的提取衛(wèi)星導(dǎo)航技術(shù)的飛速發(fā)展已逐漸取代了無線電導(dǎo)航、天文導(dǎo)航等傳統(tǒng)導(dǎo)航技術(shù),而成為一種普遍采用的導(dǎo)航定位技術(shù),并在精度、實時性、全天候等方面取得了長足進步?,F(xiàn)不僅應(yīng)用于物理勘探、電離層測量和航天器導(dǎo)航等諸多民用領(lǐng)域,在軍事領(lǐng)域更是取得了廣泛的應(yīng)用--在彈道導(dǎo)彈、野戰(zhàn)指揮系統(tǒng)、精確彈道測量以及軍用地圖快速測繪等領(lǐng)域均大量采用了衛(wèi)星導(dǎo)航定位技術(shù)。有鑒于衛(wèi)星導(dǎo)航技術(shù)在民用和軍事領(lǐng)域的重要意義,使其得到了許多國家的關(guān)注。我國也于2000年10月31日和12月21日成功發(fā)射了第一顆和第二顆導(dǎo)航定位試驗衛(wèi)星并建立了我國第一代衛(wèi)星導(dǎo)航定位系統(tǒng)--"北斗導(dǎo)航系統(tǒng)",但由于起步晚也沒有得到廣泛應(yīng)用。目前在我國應(yīng)用最多的還是美國的GPS系統(tǒng)。本文就針對當(dāng)前比較普及的GPS系統(tǒng),對其衛(wèi)星定位信息的接收及其定位參數(shù)提取的實現(xiàn)方法予以介紹。edf測繪網(wǎng)定位信息的接收通常GPS定位信息接收系統(tǒng)主要由GPS接收天線、變頻器、信號通道、微處理器、存儲器以及電源等部分組成。由于GPS定位信息內(nèi)容較少,因此多用RS-232串口將定位信息(NEMA0183語句)從GPS接收機傳送到計算機中進行信息提取處理。從串口讀取數(shù)據(jù)有多種方法,在此直接使用Win32API函數(shù)對其進行編程處理。在Windows下不允許直接對硬件端口進行控制操作,所有的端口均被視為"文件",因此在對串口進行偵聽之前需要通過打開文件來打開串口,并對其進行相關(guān)參數(shù)配置:
SetupComm(m_hCom,READBUFLEN/*讀緩沖*/,WRITEBUFLEN/*寫緩沖*/);//初始化通訊設(shè)備參數(shù)
//清除緩沖信息
PurgeComm(m_hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//對異步I/O進行設(shè)置
CommTimeOuts.ReadTotalTimeoutMultiplier=0;file://接收每字節(jié)的平均允許時間
SetCommTimeouts(m_hCom,&CommTimeOuts);
GetCommState(m_hCom,&dcb);
dcb.BaudRate=CBR_4800;
dcb.ByteSize=8;
dcb.Parity=ODDPARITY;
dcb.StopBits=ONESTOPBIT;
SetCommState(m_hCom,&dcb);
在成功打開并設(shè)置通訊口后,可采取輪詢串口和事件觸發(fā)兩種方式對數(shù)據(jù)進行接收處理,本文在此采取效率比較高的事件觸發(fā)方式進行接收處理,通過等待EV_RXCHAR事件的發(fā)生來啟動ReadFile函數(shù)完成對GPS定位信息的接收:while(true){
WaitCommEvent(m_hCom,&dwEvtMask,NULL);
if(dwEvtMask&EV_RXCHAR==EV_RXCHAR)
if(ComStat.cbInQue>0)
ReadFile(m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead);
}
提取定位數(shù)據(jù)GPS接收機只要處于工作狀態(tài)就會源源不斷地把接收并計算出的GPS導(dǎo)航定位信息通過串口傳送到計算機中。前面的代碼只負責(zé)從串口接收數(shù)據(jù)并將其放置于緩存,在沒有進一步處理之前緩存中是一長串字節(jié)流,這些信息在沒有經(jīng)過分類提取之前是無法加以利用的。因此,必須通過程序?qū)⒏鱾€字段的信息從緩存字節(jié)流中提取出來,將其轉(zhuǎn)化成有實際意義的,可供高層決策使用的定位信息數(shù)據(jù)。同其他通訊協(xié)議類似,對GPS進行信息提取必須首先明確其幀結(jié)構(gòu),然后才能根據(jù)其結(jié)構(gòu)完成對各定位信息的提取。對于本文所使用的GARMINGPS天線板,其發(fā)送到計算機的數(shù)據(jù)主要由幀頭、幀尾和∧謔葑槌桑菔葜〉牟煌⊥芬膊幌嗤饕?$GPGGA"、"$GPGSA"、"$GPGSV"以及"$GPRMC"等。這些幀頭標識了后續(xù)幀內(nèi)數(shù)據(jù)的組成結(jié)構(gòu),各幀均以回車符和換行符作為幀尾標識一幀的結(jié)束。對于通常的情況,我們所關(guān)心的定位數(shù)據(jù)如經(jīng)緯度、速度、時間等均可以從"$GPRMC"幀中獲取得到,該幀的結(jié)構(gòu)及各字段釋義如下:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh<1>當(dāng)前位置的格林尼治時間,格式為hhmmss<2>狀態(tài),A為有效位置,V為非有效接收警告,即當(dāng)前天線視野上方的衛(wèi)星個數(shù)少于3顆。<3>緯度,格式為ddmm.mmmm<4>標明南北半球,N為北半球、S為南半球<5>徑度,格式為dddmm.mmmm<6>標明東西半球,E為東半球、W為西半球<8>方位角,范圍為000.0到359.9度<9>日期,格式為ddmmyy<10>地磁變化,從000.0到180.0度<11>地磁變化方向,為E或W至于其他幾種幀格式,除了特殊用途外,平時并不常用,雖然接收機也在源源不斷地向主機發(fā)送各種數(shù)據(jù)幀,但在處理時一般先通過對幀頭的判斷而只對"$GPRMC"幀進行數(shù)據(jù)的提取處理。如果情況特殊,需要從其他幀獲取數(shù)據(jù),處理方法與之也是完全類似的。由于幀內(nèi)各數(shù)據(jù)段由逗號分割,因此在處理緩存數(shù)據(jù)時一般是通過搜尋ASCII碼"$"來判斷是否是幀頭,在對幀頭的類別進行識別后再通過對所經(jīng)歷逗號個數(shù)的計數(shù)來判斷出當(dāng)前正在處理的是哪一種定位導(dǎo)航參數(shù),并作出相應(yīng)的處理。下面就是對緩存Data中的數(shù)據(jù)進行解幀處理的主要代碼,本文在此只關(guān)心時間(日期和時間)和地理坐標(經(jīng)、緯度):for(inti=0;iBR>if(Data[i]=='$')file://幀頭,SectionID為逗號計數(shù)器
SectionID=0;
}
SectionID++;
else{
switch(SectionID){
m_sTime+=Data[i];
break;
case2:file://判斷數(shù)據(jù)是否可信(當(dāng)GPS天線能接收到有3顆GPS衛(wèi)星時為A,可信)
if(Data[i]=='A')
GPSParam[m_nNumber].m_bValid=true;
break;
m_sPositionY+=Data[i];
break;
m_sPositionX+=Data[i];
break;
m_sDate+=Data[i];
break;
default:
break;
}
}
}現(xiàn)在已將所需信息提取到內(nèi)存,即時間、日期以及經(jīng)緯度分別保存在CString型變量m_sTime、m_Data、m_sPositionY和m_sPositionX中。在實際應(yīng)用中往往要根據(jù)需要對其做進一步的運算處理,比如從GPS接收機中獲得的時間信息為格林尼治時間,因此需要在獲取時間上加8小時才為我國標準時間。而且GPS使用的WGS-84坐標系也與我國采用的坐標系不同,有時也要對此加以變換。而這些變換運算必須通過數(shù)值運算完成,因此需要將前面獲取的字符型變量轉(zhuǎn)化為數(shù)值型變量,這部分工作可放在檢測到幀尾完成:::strcpy(buf,m_sTime);
str.Format("%c%c",buf[0],buf[1]);
第2、3字節(jié)為分鐘,4、5字節(jié)為秒,提取方法同上
……
::strcpy(buf,m_sDate);
第2、3字節(jié)為天,4、5字節(jié)為年,提取方法同上
……
::strcpy(buf,m_sPositionY);
str.Format("%c%c",buf[0],buf[1]);
PositionValue=atoi(str);
str.Format("%c%c%c%c%c%c%c",buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8]);
……
::strcpy(buf,m_sPositionX);
if(m_sPositionX.GetLength()==10)file://經(jīng)度超過90度(如東經(jīng)125度)
{
str.Format("%c%c%c",buf[0],buf[1],buf[2]);
PositionValue=atoi(str);
str.Format("%c%c%c%c%c%c%c",buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
GPSParam[m_nNumber].m_dPositionX=PositionValue*60+atof(str);file://提取出經(jīng)度(單位為分)
}
if(m_sPositionX.GetLength()==9)file://經(jīng)度未超過90度(如東經(jīng)89度)
{
file://處理方法同上,只是buf的第0、1字節(jié)為度數(shù),2~9為分數(shù)。
}
到此為止,已將時間和經(jīng)緯度信息提取到GPS結(jié)構(gòu)數(shù)組GPSParam中的各個變量中去,后續(xù)的處理和高層決策可
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力設(shè)施維護與檢修操作指南(標準版)
- 護理管理核心制度
- 公共交通乘客服務(wù)管理制度
- 超市員工休息及休假制度
- 2025年項目進度控制與監(jiān)控規(guī)范
- 2026年玉樹州人民醫(yī)院合同制人員招聘備考題庫完整答案詳解
- 包頭市青山區(qū)教育系統(tǒng)2026年校園招聘備考題庫(內(nèi)蒙古師范大學(xué)考點)帶答案詳解
- 2026年聊城市市屬事業(yè)單位定向招聘隨軍未就業(yè)家屬備考題庫附答案詳解
- 養(yǎng)老院服務(wù)質(zhì)量監(jiān)督制度
- 天津醫(yī)科大學(xué)口腔醫(yī)院2026年人事代理制(第二批)招聘實施備考題庫帶答案詳解
- 邀約來訪活動策劃方案(3篇)
- 2025年煙臺理工學(xué)院馬克思主義基本原理概論期末考試筆試真題匯編
- 2025年保險理賠流程操作規(guī)范手冊
- 彩鋼瓦屋面施工組織方案
- 路燈勞務(wù)施工方案(3篇)
- 2026屆高考復(fù)習(xí)之鑒賞詩歌的語言 教學(xué)課件
- 七年級上冊文言文虛詞詳解匯編
- 2025年軍事理論知識考核試題及答案
- 2026屆云南省昆明市五華區(qū)數(shù)學(xué)高二第一學(xué)期期末考試試題含解析
- 部編版六年級語文期末復(fù)習(xí)易錯題專題練習(xí)
- 2025年深圳非高危安全管理員和企業(yè)負責(zé)人習(xí)題(有答案版)(1)1
評論
0/150
提交評論