摘要:該文介紹了GPS的數據采集格式和在Windows環境下,用VC++6.0開發基于Windows消息機制的多線程的GPS應用程序,并簡要給出了說明實例。
關鍵詞:GPS;數據格式;串行通信;多線程
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)35-2143-02
GPS的中文簡要含義是“全球定位系統”,是英文Navigation Satellite Timing andRanging/Global Postioning System的縮寫詞NAVSTAR/GPS的簡稱,是在美國聯合計劃局領導下誕生的方案,成為繼阿波羅登月計劃之后的第三項龐大空間計劃。它從根本上解決了人類在地球上的導航和定位問題。
對于用戶來說,最重要的關鍵設備就是用戶接收機(GPS接收機)。很多情況下,用戶都是用計算機和GPS接收機通信,將GPS信息導入計算機然后再處理。而VC由于其在和GPS接收機的通信及后面的數據處理應用方面的強大威力,成為許多用戶開發GPS應用程序的首選開發語言。該文將介紹利用VC編寫計算機與GPS接收機的通信和Windows消息的傳遞
及多線程的GPS應用程序。
1 GPS用戶端的數據錄取及數據輸出格式
GPS數據傳送分為同步串行傳送和異步串行傳送。在計算機與GPS通訊進行數據傳送時,都采用異步串行傳送方式。GPS作為數據終端設備(DTE)與計算機(DCE)之間利用D型RS 232C電纜接口進行數據交換。從數據輸出形式來看,GPS的輸出分為兩類:二進制碼與十進制ASCII碼。
二進制碼是用0和1表示的編碼。此種編碼雖然不直觀,但運算方便,在計算機中應用非常普遍。目前通用的字長為8位,可用兩位16進制數表示。在編碼時,一個二進制數由小數點向左,每4位一分,不足4位前面補0,組成整數部分。由小數點向右,每4位一分,不足4位前面補0,組成小數部分。輸出/輸入二進制數據流的格式是低字節/高字節排列,每一個字節的輸出次序是從最低有效位到最高有效位。GPS的原始觀測量、星歷以及其他數據都采用了二進制編碼。為了滿足異步串行通訊的要求,每一組數據須包含三個部分:字頭塊、數據塊和結束符。字頭塊包括電文的標志和語句名。數據塊包括電文中的全部數據。結束符包括校驗和與回車換行。各種GPS接收機的數據格式在總體結構上相同,但具體采用的符號、內容、字長等各不相同。因此,在編寫軟件之前,需知道此數據的具體結構。另外,在編寫軟件時,為了確保數據的傳送和采集質量,必須進行校驗和檢驗。
十進制碼比較直觀,易于識別和應用。GPS的統一標準格式NMEA 0183輸出就采用ASCII碼。其格式定義如下:
比特率:4 800 b/s;數據位:8 b;奇偶校驗:無;開始位:1 b;停止位:1 b
2 基本串行通訊協議程序
2.1 初始化程序段
HANDLEm_ hComm;
m_ hComm = CreateFile (m_ sFileName, GENERIC_
READ| GENERIC_ WRITE,0,NULL,OPEN _EXISTING,
FILE_ ATTRIBUTE_ NORMAL,NULL);
(m sFileName一般取“com1”或“com2”,其他參數請參考MSDN,由于篇幅關系,這里不作詳細介紹。)
BOOL SetupComm (HANDLE hFile, DWORD dwIn_Queue,DWORD dwOutQueue);
HFile取上面創建的串行通信句柄,dwInQueue,dwOutQueue分別是輸入緩存和輸出緩存的大小,一般取1000即可。
2.2 設置串行通訊環境
DCB dcb; SetCommState(m_ hComm,dcb);
DCB是串行通信設備的控制字,對GPS來說,要設置比特率、數據位、奇偶校驗、開始位、停止位、還要設置RTS、DTR等串行通信協議。
2.3 設置串行通訊時限
COMMTIMEOUTS commtimeouts; SetCommTimeouts(m_ hComm,commtimeouts);
COMMTIMEOUTS是一個結構,讀和寫的間隔字符的時間和總共的時間,單位是毫秒。通過上面的設置,就可以進行串口的讀和寫。
2.4 讀、寫串口程序
讀語句:DWORD iLength; void* pBuffer; DWORD pReadFact; ReadFile (m_ hComm, pBuffer, iLength, pReadFact,NULL);
讀到的數據放在內存pBuffer里,pBuffer要先申請好內存空間,iLength為需要讀的數據長度,pReadFact存放實際讀的數據長度。
寫語句:
DWORD iLength; void * pBuffer; DWORD pReadFact; WriteFile ( hComm, pBuffer, iLength, pWriteFact,NULL);
要寫的數據放在內存pBuffer里,iLength為需要寫的數據長度,pReadFact存放實際寫的數據長度。
3 通訊程序中的多線程語句及Windows消息傳遞
相對于GPS數據處理,計算機和GPS的通信要慢得多,而且和GPS的通信還有可能要阻塞,有時計算機還需要和多臺GPS通信,所以如果應用程序寫成單線程的話,是很不理想的選擇。
寫多線程的程序主要是給GPS通信的讀和寫分別開一個線程。開線程的API如下:
HANDLE CreateThread(LPSECURITY _ATTRIBUTES
lpThreadAttributes, DWORD wStackSize, LPTHREAD_
STAR_T ROUTINE lpStartAddress,LPVOID lpParameter,
DWORD dwCreationFlags,LPDWORD lpThreadid);
由于篇幅關系,具體參數含義請參見MSDN。
在寫多線程程序時,一定要仔細考慮須傳遞的參數結構。還有,在寫多線程程序時還要考慮線程的同步問題,這主要通過下面的API來解決;
DWORD WaitForSingleObject ( HANDLE hHandle,DWORD dwMilliseconds);
HHandle是需要同步的對象的句柄,本程序中取m hComm,即串口句柄。DwMilliseconds是等待的時間,一般取INFINITE,即無限等待。
此外,由于是多線程程序,當計算機和一個GPS通信完成時,必須要通知GPS數據處理線程,現在可以處理數據了。然后通信線程繼續和GPS通信,數據處理線程開始處理數據。
通信線程和數據處理線程之間的通信就是采用Windows的消息機制。發送消息的API如下:
BOOL PostMessage ( HWND hWnd, UINT Msg,WPARAM wParam,LPAPAM IParam);
HWnd是數據處理線程的窗口句柄。Msg是自定義的消息標識,比如接收成功(WM RECEIVEK)等等。wParam和LParam是需要傳遞的消息參數,比如可以將接收到的數據傳遞給數據處理線程等等。
4 結束語
在實際工作中,我們一般采用以下幾個步奏,外場數據采集,數據回送(其中包含遠程光纜數據傳輸和人工回送),之后通過D型RS-232C接口的連接,完成本文采用的——GPS接收機和計算機之間的的數據通訊,從而實現數據傳遞以及相關的數據處理。雖然GPS接收機有不同的具體數據格式,但是應用本文所論述的技術,依然可以編寫出一個實用的GPS應用程序。目前這個方法,用在實際工作中經驗證,數據傳輸不存在誤碼,穩妥可靠。
參考文獻:
[1] 王廣運,郭秉義,李洪濤.差分定位技術與應用[M],北京:電子工業出版社,1998.
[2] 周明德.微型計算機系統原理及應用[M].北京:清華大學出版社,1998.