通常,GPS接收機被設計成為標準串口裝置,不管是CF介面還是藍芽介面,都被映射成為串口裝置,因此,在程式員的眼中,只需如同一般的串口裝置來對待即可(對於藍芽GPS,當然我們也可以通過藍芽API,在程式中完成裝置搜尋、映射工作,而減少使用者手工處理的麻煩)。
藉助前一篇文章“WinCE下的串口操作”提供的串口類庫,我們可以很方便的建立一個GPS類庫,但在這個工作之前,我們還是簡單的看一下GPS裝置的工作過程:
GPS是美國提供的一套基於衛星的全球定位系統,它由天空中運行著的24顆衛星組建的星座及多個地面注入站和監視站構成的控制/監視網構成,衛星採用 CDMA技術在兩個頻率上向地面廣播測距碼和導航資料,導航資料也稱為星曆,接收機可以從中獲知衛星在發射訊號時的位置,而測距碼是一個偽隨機序列,接收機通過自身產生的偽隨機序列與其進行相關計算,可得到訊號從衛星到接收機之間的傳播時延,但這個時延是一個假時延,因為接收機不可能與衛星保持精確的時鐘同步,而由於各個衛星是由自身攜帶的原子鐘進行校準的,因此,雖然接收機與衛星時鐘不同步,但可以通過增加一個衛星的方式來獲得定位。也就是由四顆衛星的位置、四個偽時延,構成四個方程,來求解接收機的三維座標和同步時間基點這四個位置量。
這個過程看起來有點複雜,但慶幸的是,程式員不需要做與此相關的工作,它們都被GPS接收機自己處理了,它自己就可以接受並處理衛星訊號,並完成定位,同時把定位結果通過介面以某種電文格式遞交給電腦,因此,電腦只需要簡單的開啟GPS串連的串口,去等待接收機不斷的把資料送過來就可以了。
定位元據是以什麼格式送過來的,我們在購買GPS接收機的時候,它都會標註一個資料格式標準,通常所見的都是採用NMEA(美國國家航海電子協會)標準,它規定了如下幾種電文格式:
1.GPRMC:報告接收機的經緯度、航速和航向資訊,但沒有高度值
2.GPGGA:報告接收機的經緯度、高度值、定位精度等資訊,但沒有航速和航向
3.GPGSV:報告接收機所觀測到的衛星數量、訊號品質、在天空中的方位和仰角、當前定位所採用的衛星編號等資訊
4.GPGSA:報告接收機當前定位所採用定位方式、定位精度等資訊,但這裡的定位精度只是由衛星布局和採用的衛星數量所產生的幾何偏差,並不是真正的定位誤差
一般的GPS接收機都是同時產生這幾種電文,以相同的時間間隔順序的把這幾種電文發過來,每條電文都是獨立一行,並以$符號開頭,後面附加電文標識及內容,具體的內容格式可以從[url]www.nmea.org[/url]網站或GPS接收機說明書上找到。
好了,不再贅述,我們來看程式,從說明書上我們查到GPS接收機的串口設定,依照該設定開啟串口,啟動一個背景工作執行緒,在該線程中不斷的從串口讀入資料行,分析得到定位資訊、衛星狀態、定位誤差,並通過回呼函數指標將這些資訊送回主線程就可以了。
整個過程非常簡單,沒有任何特別之處,讀一下程式就非常清楚了。
好了,現在你就可以為自己的PocketPC+GPS開發自己的定位、跟蹤程式了,可以做一個自己的路線跟蹤程式、電子羅盤、並配合自己打造的電子地圖,出行遠足,是不是很爽!我還做過一個GPS衛星軌跡的記錄程式,把一天內GPS衛星在天空中的運行路線記錄下來,也很有意思!