新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于WinCE的GPS導(dǎo)航數(shù)據(jù)提取的設(shè)計與研究

基于WinCE的GPS導(dǎo)航數(shù)據(jù)提取的設(shè)計與研究

作者: 時間:2011-02-16 來源:網(wǎng)絡(luò) 收藏

Windows CE 是一個開放的、可裁剪的、32位實時窗口操作系統(tǒng),具有可靠性好、實時性高、內(nèi)核體積小的特點,廣泛應(yīng)用于各種智能式設(shè)備的開發(fā)。系統(tǒng)通過微軟提供的Platform Builder定制需要的Windows CE5.0系統(tǒng),運行在硬件平臺上。硬件平臺采用博創(chuàng)科技PXA270實驗箱,該實驗箱處理器是基于ARMV5E的Xscale核心PXA270,并支持串口通信。

GPS導(dǎo)航芯片采用天寶iQ 46240,將接收到的數(shù)據(jù)通過串口發(fā)送給處理器。串口是計算機系統(tǒng)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,是通信最可靠、最通用的通信方式。程序員利用Windows API函數(shù)可以編寫出高效、可移植性的應(yīng)用程序。Windows CE不支持Windows下常用的串行通信異步I/O方式(Overlapped,非阻塞),因此在嵌入式環(huán)境下采用了同步I/O方式的通信程序設(shè)計方法。

實驗設(shè)計根據(jù)GPS導(dǎo)航數(shù)據(jù)有效性確認的標準,對提取的數(shù)據(jù)進行處理,把緩存中接收到的GPS數(shù)據(jù)格式轉(zhuǎn)化為電子地圖上常用的浮點型格式。此設(shè)計已應(yīng)用于智能閱讀器盲用定位模塊中。

1 串口通信同步I/O方式的程序設(shè)計

串口通信是串行通信的一種,串行通信的模式一般分為上位機和下位機通信。上位機可以讀取下位機的狀態(tài)數(shù)據(jù),也可以設(shè)置下位機的狀態(tài)。一般串行通信協(xié)議可分為兩類,即讀和寫。讀寫協(xié)議的描述如圖1所示,常用的效驗碼有異或、累加和、CRC等[1]。

在實驗設(shè)計中,GPS接收裝置作為下位機只負責(zé)提供固定格式的數(shù)據(jù),實驗箱作為上位機不必發(fā)送指令,只負責(zé)定時讀取GPS接收裝置發(fā)送的數(shù)據(jù)。即可以簡化通信協(xié)議,提高工作效率。

1.1 設(shè)計開發(fā)環(huán)境

在Windows NT/ME環(huán)境下安裝eVC4.0編程環(huán)境,設(shè)置順序如下:

(1)安裝同步軟件Microsoft ActiveSync 4.0;
(2)安裝eVC4.0;
(3)利用PB(Platform Builder5.0)定制Wince系統(tǒng)對應(yīng)的SDK并安裝;
(4)利用PB將定制的wince系統(tǒng)下載到實驗箱上,并與PC機同步[2]。

1.2 同步I/O方式讀取的設(shè)計方法

為完成串口通信同步I/O方式程序設(shè)計,分為三個部分,每個部分有一個函數(shù)完成其對應(yīng)的功能[3]。函數(shù)原型為:

OnOpenCom(); //打開并設(shè)置串口
ReadThreadFunc(LPVOID lparam); //串口接收線程
OnSeriesRead(CWnd *pWnd, BYTE *buf, int bufLen);
//串口接收數(shù)據(jù)成功回調(diào)函數(shù)
串口接收的具體流程圖如圖2所示,圖中對應(yīng)了串口設(shè)置的三個功能函數(shù)。

1.3 程序設(shè)計的核心代碼實現(xiàn)

1.3.1 打開并設(shè)置通信串口參數(shù)

以同步讀取方式打開串口COM1

m_hComm=CreateFile(_T("COM1:"), GENERIC_READ|GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
//配置串口,得到打開串口的當前屬性參數(shù),修改后再重新設(shè)置串口。
DCB portDCB;
portDCB.DCBlength=sizeof(DCB);//DCB結(jié)構(gòu)大小
portDCB.BaudRate=CBR_4800; //波特率
  portDCB.ByteSize=8; //字符位
portDCB.Parity=NOPARITY; //奇偶校驗位
portDCB.StopBits=ONESTOPBIT; //停止位
//設(shè)置串口讀寫時間,配置超時
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(m_hComm,CommTimeouts);
CommTimeouts.ReadIntervalTimeout= MAXDWORD;
CommTimeouts.ReadTotalTimeoutMultiplier=0;
CommTimeouts.ReadTotalTimeoutConstant=0;
//指定端口監(jiān)測的事件集
SetCommMask (m_hComm, EV_RXCHAR);
//分配設(shè)備緩沖區(qū)
SetupComm(m_hComm,512,512);
//初始化緩沖區(qū)中的信息
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_
RXCLEAR);
m_hReadCloseEvent=CreateEvent(NULL,TRUE,FALSE,
NULL);

1.3.2 GPS定位信息的接收

在成功打開并設(shè)置通信口后,在主程序中創(chuàng)建線程函數(shù)ReadThreadFunc(LPVOID lparam):

//創(chuàng)建串口接收線程
hRecvThread=CreateThread(0, 0, CommRecvTread, this, 0, IDThread);

然后在線程函數(shù)中采取事件觸發(fā)方式進行接收處理,通過等待EV_RXCHAR事件的發(fā)生來啟動ReadFile函數(shù)完成對GPS定位信息的接收:

while (TRUE){
if (evtMask EV_RXCHAR){
ClearCommError(m_hComm,dwReadErrors,cmState);
willReadLen = cmState.cbInQue ;
//接收緩沖區(qū)中存儲的待讀取的字符數(shù)
readBuf = new BYTE[willReadLen+1];
ReadFile(m_hComm,readBuf,willReadLen,actualReadLen,0);
readBuf[willReadLen]=0;//如果讀取的數(shù)據(jù)大于0,
if (actualReadLen>0){ //觸發(fā)讀取回調(diào)函數(shù)m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,actualReadLen); }}

如果收到讀線程退出信號,則退出線程

if(WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0) break;

2 對導(dǎo)航數(shù)據(jù)的格式進行處理

對于實驗中所使用的iQ46240接收芯片,其發(fā)送到計算機的數(shù)據(jù)(采用NEMA0183語句)主要由幀頭、幀尾和幀內(nèi)數(shù)據(jù)組成。根據(jù)數(shù)據(jù)幀的不同,幀頭也不相同,主要有“$GPGGA”、“$GPGSA”、“$GPRMC”等。這些幀頭標識了后續(xù)幀內(nèi)數(shù)據(jù)的組成結(jié)構(gòu),各幀均以回車符和換行符作為幀尾識別一幀的結(jié)束。本文中,定位數(shù)據(jù)經(jīng)緯度、速度、時間等均可以從“$GPGGA”幀中獲取得到。該幀的結(jié)構(gòu)及各字段釋義如下[4]:
$GPGGA,1>,2>,3>,4>,5>,6>,7>,8>,9>,10,11>,12>,13>,14>*hh
1>當前位置的格林尼治時間
2>緯度值
3>緯度標識,N或者S(南北)
4>經(jīng)度值
5>經(jīng)度標識,E或者W(東西)
6>衛(wèi)星接收信號質(zhì)量
7>正在使用衛(wèi)星的數(shù)量

2.1 GPS導(dǎo)航數(shù)據(jù)有效性確認標準

GPS定位的基本原理是根據(jù)高速運動衛(wèi)星的瞬間位置作為已知的起算數(shù)據(jù),采用空間距離后方交會的方法確定待測點的位置。假設(shè)t時刻在地面待測點安置GPS接收機,可以測定GPS信號到達接收機的時間,加上接收機所接收到的衛(wèi)星星歷等其他數(shù)據(jù)可以確定以下4個方程式。衛(wèi)星定位示意圖如圖3所示。


xi,yi,zi(i=1,2,3,4)分別代表衛(wèi)星1、2、3、4在t時刻的空間直角坐標,可由衛(wèi)星導(dǎo)航電文求得,Vti代表衛(wèi)星鐘差,Vt0為接收機的鐘差。

由以上4個方程式可計算出待測點的坐標x、y、z和接收機的鐘差Vt0。因此導(dǎo)航數(shù)據(jù)能夠有效計算必須保證接收到4個衛(wèi)星的星歷。對固定格式的導(dǎo)航電碼中提取衛(wèi)星符號進行確認,如果滿足4個衛(wèi)星的接收狀態(tài)即可確定當前接收的導(dǎo)航電碼可用于數(shù)據(jù)處理。通常,3顆衛(wèi)星可以在二維平面上得到經(jīng)度緯度坐標,為精確起見,4顆衛(wèi)星可以保證獲得三維空間坐標。

2.2 有效數(shù)據(jù)提取和數(shù)據(jù)格式轉(zhuǎn)化

 有效數(shù)據(jù)的提取和數(shù)據(jù)格式轉(zhuǎn)化都是在回調(diào)函數(shù)中進行的[5]。幀內(nèi)各數(shù)據(jù)段由逗號分割,因此在處理緩存數(shù)據(jù)時,可以通過搜索ASCII碼“$”來判斷是否是幀頭。對幀頭類別進行識別后,再通過對所經(jīng)歷逗號的個數(shù)計數(shù)來判斷當前處理的是哪一種定位導(dǎo)航參數(shù),并做相應(yīng)的處理。eVC支持CString類型格式,由于定位信息格式固定,本文先利用mbstowcs函數(shù)將緩存中的字符型數(shù)據(jù)轉(zhuǎn)換為寬字符型,然后強制轉(zhuǎn)化為字符串類型。

WCHAR wszbuf[512];

mbstowcs(wszbuf,(char*)buf,strlen((char*)buf));字符串類型進行處理,然后利用Find函數(shù),搜索"$GPGGA",

strRecv.Find(_T("$GPGGA"),1);
state=strRecv.Mid(pos+37,1);

得到GPS 質(zhì)量指示指標

strSatelliteNum=strRecv.Mid(pos+39,1) ;

得到接收到的衛(wèi)星數(shù)量字符,將衛(wèi)星數(shù)量字符型轉(zhuǎn)化為整型判斷衛(wèi)星數(shù)量是否大于4,作為判斷是否為有效數(shù)據(jù)的標準。

int iSatelliteNum=atoi((LPSTR)(LPCTSTR)strSatelliteNum);

當iSatelliteNum>3 state = =‘1’時說明接收到的是有效數(shù)據(jù),可對strRecv中的數(shù)據(jù)進行提取,并賦給經(jīng)緯度和時間變量。

strLatitude =strRecv.Mid(pos+16,8);
strLongitude=strRecv. Mid(pos+27,9);

將提取到得經(jīng)度緯度字符型數(shù)據(jù)轉(zhuǎn)化為浮點型數(shù)據(jù),通過atof函數(shù)實現(xiàn)。

double Longitude_new = (atof(strLongitude))/100;
double Latitude_new = (atof(strLatitude))/100;

這樣將經(jīng)度緯度信息提取到GPS結(jié)構(gòu)數(shù)組中,后續(xù)的處理和高層決策可根據(jù)該結(jié)構(gòu)中存儲的數(shù)據(jù)作出相應(yīng)的處理。

3 程序運行結(jié)果分析

程序運行后,在實驗平臺上收集的部分數(shù)據(jù)如表1所示。

對以上結(jié)果分析,可知通過串口在不同時段接收的數(shù)據(jù)是比較穩(wěn)定的,能夠以此為基礎(chǔ)提取到有效的數(shù)據(jù)和定位信息,本系統(tǒng)結(jié)合超圖格式(pwr,pmw)的北京市公交站點地圖數(shù)據(jù),在編寫程序時調(diào)用超圖接口函數(shù)打開電子地圖數(shù)據(jù),將串口接收到的數(shù)據(jù)讀入,得到附近的公交站點并以文本方式輸出到界面。

本文結(jié)合相關(guān)程序代碼陳述了基于eVC環(huán)境下串口通信程序的設(shè)計,對GPS全球定位系統(tǒng)定位信息的接收和數(shù)據(jù)提取進行了詳細的分析和討論。主要解決了EVC編程環(huán)境下實現(xiàn)串口通信功能、對GPS定位信息的提取和處理的問題。實驗對wince5.0自定義平臺下開發(fā)GPS接收裝置給出了代碼樣例供參考,并已應(yīng)用于智能閱讀器項目中盲用定位模塊。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉