?? 新建 文本文檔.txt
字號:
提取定位數據
GPS接收機只要處于工作狀態就會源源不斷地把接收并計算出的GPS導航定位信息通過串口傳送到計算機中。前面的代碼只負責從串口接收數據并將其放置于緩存,在沒有進一步處理之前緩存中是一長串字節流,這些信息在沒有經過分類提取之前是無法加以利用的。因此,必須通過程序將各個字段的信息從緩存字節流中提取出來,將其轉化成有實際意義的,可供高層決策使用的定位信息數據。同其他通訊協議類似,對GPS進行信息提取必須首先明確其幀結構,然后才能根據其結構完成對各定位信息的提取。對于本文所使用的GARMIN GPS天線板,其發送到計算機的數據主要由幀頭、幀尾和幀內數據組成,根據數據幀的不同,幀頭也不相同,主要有"$GPGGA"、"$GPGSA"、"$GPGSV"以及"$GPRMC"等。這些幀頭標識了后續幀內數據的組成結構,各幀均以回車符和換行符作為幀尾標識一幀的結束。對于通常的情況,我們所關心的定位數據如經緯度、速度、時間等均可以從"$GPRMC"幀中獲取得到,該幀的結構及各字段釋義如下:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh
<1> 當前位置的格林尼治時間,格式為hhmmss
<2> 狀態, A 為有效位置, V為非有效接收警告,即當前天線視野上方的衛星個數少于3顆。
<3> 緯度, 格式為ddmm.mmmm
<4> 標明南北半球, N 為北半球、S為南半球
<5> 徑度,格式為dddmm.mmmm
<6> 標明東西半球,E為東半球、W為西半球
<7> 地面上的速度,范圍為0.0到999.9
<8> 方位角,范圍為000.0到 359.9 度
<9> 日期, 格式為ddmmyy
<10> 地磁變化,從000.0到 180.0 度
<11> 地磁變化方向,為E 或 W
至于其他幾種幀格式,除了特殊用途外,平時并不常用,雖然接收機也在源源不斷地向主機發送各種數據幀,但在處理時一般先通過對幀頭的判斷而只對"$GPRMC"幀進行數據的提取處理。如果情況特殊,需要從其他幀獲取數據,處理方法與之也是完全類似的。由于幀內各數據段由逗號分割,因此在處理緩存數據時一般是通過搜尋ASCII碼"$"來判斷是否是幀頭,在對幀頭的類別進行識別后再通過對所經歷逗號個數的計數來判斷出當前正在處理的是哪一種定位導航參數,并作出相應的處理。下面就是對緩存Data中的數據進行解幀處理的主要代碼,本文在此只關心時間(日期和時間)和地理坐標(經、緯度):
for(int i=0;i if(Data[i]=='$') file://幀頭,SectionID為逗號計數器
SectionID=0;
if(Data[i]==10){ file://幀尾
}
if(Data[i]==',') file://逗號計數
SectionID++;
else {
switch(SectionID){
case 1: file://提取出時間
m_sTime+=Data[i];
break;
case 2: file://判斷數據是否可信(當GPS天線能接收到有3顆GPS衛星時為A,可信)
if(Data[i]=='A')
GPSParam[m_nNumber].m_bValid=true;
break;
case 3: file://提取出緯度
m_sPositionY+=Data[i];
break;
case 5: file://提取出經度
m_sPositionX+=Data[i];
break;
case 9: file://提取出日期
m_sDate+=Data[i];
break;
default:
break;
}
}
}
現在已將所需信息提取到內存,即時間、日期以及經緯度分別保存在CString型變量 m_sTime、m_Data、m_sPositionY和m_sPositionX中。在實際應用中往往要根據需要對其做進一步的運算處理,比如從GPS接收機中獲得的時間信息為格林尼治時間,因此需要在獲取時間上加8小時才為我國標準時間。而且GPS使用的WGS-84坐標系也與我國采用的坐標系不同,有時也要對此加以變換。而這些變換運算必須通過數值運算完成,因此需要將前面獲取的字符型變量轉化為數值型變量,這部分工作可放在檢測到幀尾完成:
::strcpy(buf,m_sTime);
str.Format("%c%c",buf[0],buf[1]);
GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24; file://提取出小時并轉化為24小時制北京時間
file://buf第2、3字節為分鐘,4、5字節為秒,提取方法同上
……
::strcpy(buf,m_sDate);
str.Format("%c%c",buf[0],buf[1]); file://提取出月份
file://buf第2、3字節為天,4、5字節為年,提取方法同上
……
::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]);
GPSParam[m_nNumber].m_dPositionY=PositionValue*60+atof(str); file://提取出緯度
……
::strcpy(buf,m_sPositionX);
if(m_sPositionX.GetLength()==10) file://經度超過90度(如東經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://提取出經度(單位為分)
}
if(m_sPositionX.GetLength()==9) file://經度未超過90度(如東經89度)
{
file://處理方法同上,只是buf的第0、1字節為度數,2~9為分數。
}
到此為止,已將時間和經緯度信息提取到GPS結構數組GPSParam中的各個變量中去,后續的處理和高層決策可根據該結構中存儲的數據作出相應的處理。
小結
本文結合主要的相關程序代碼對GPS全球定位系統的定位導航信息的接收和參數數據的提取進行了討論,同時也對串口的程序設計作了簡要的講述。通過本文的設計方法可以將GPS定位導航信息從GPS接收機完整接收,通過對定位參數的提取可將其應用于其他高層應用決策如各種GIS、RS系統等。本文程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -