摘 要:伴隨著GPS的廣泛應(yīng)用,基于PC機(jī)的GPS由于其價格及功耗較高已不能滿足社會發(fā)展的需要,嵌入式定位技術(shù)迅速發(fā)展起來。結(jié)合ARM處理器及嵌入式Linux操作系統(tǒng)的優(yōu)勢,提出一種基于嵌入式Linux平臺的通用GPS接口設(shè)計方案。首先介紹GPS系統(tǒng)的定位原理與通信格式,在此基礎(chǔ)上較為詳細(xì)地闡述基于串行接口的嵌入式Linux與GPS設(shè)備的通信方案,最后給出基于中斷模式的GPS信號接收與提取方法。該方案具有較強(qiáng)的通用性,可廣泛應(yīng)用于便攜式GPS系統(tǒng)中。
關(guān)鍵詞:ARM;嵌入式Linux;GPS;串行接口
中圖分類號:TP368.1;TP336文獻(xiàn)標(biāo)識碼:B
文章編號:1004373X(2008)2203904
Design and Implementation of General GPS Interface Solution Based
on Embedded Linux Operation System
LI Xuebin
(Changzhi College,Changzhi,046011,China)
Abstract:With the widely deployment of GPS,the system based on desktop can not meet the application requirements due to its high prize and high energy consumption,and embedded GPS technology is more and more popular.In this paper,a new kind of GPS interface solution uniting the advantages of ARM processor and embedded Linux operation system is proposed,which is based on embedded Linux platform.The paper first introduces the position principle and communication protocol of GPS,and illuminates the new COM-based communication solution between embedded Linux operation system and GPS system.An interruption-based GPS signal receiving-resolving solution is also illustrated.The solution can be used in various packed GPS systems.
Keywords:ARM;embedded Linux;GPS;serial interface
1 引 言
全球定位系統(tǒng)(Global Position System,GPS)是美國從20世紀(jì)70年代由美國國防部批準(zhǔn)開始研制的,具有在海、陸、空進(jìn)行全方位實時三維導(dǎo)航與定位能力的新一代衛(wèi)星導(dǎo)航與定位系統(tǒng)。雖然最初GPS衛(wèi)星定位系統(tǒng)是為軍事用途而設(shè)計的,但其精密的全球定位、簡便的觀測、優(yōu)異的實時性、豐富的功能、良好的抗干擾性能、極強(qiáng)的保密性等特點,使其獲得廣泛的應(yīng)用。在火險處理中,精確的地理定位具有重要的意義,GPS的以上特點使其特別適合于火災(zāi)報警系統(tǒng)中的精確定位。
嵌入式系統(tǒng)是將先進(jìn)的計算機(jī)技術(shù)、半導(dǎo)體技術(shù)和電子技術(shù)以及各個行業(yè)的具體應(yīng)用相結(jié)合后的產(chǎn)物。它可以根據(jù)應(yīng)用需求對軟硬件進(jìn)行適當(dāng)裁剪,以滿足應(yīng)用系統(tǒng)對功能、可靠性、成本、體積等的需求。隨著計算機(jī)技術(shù)的發(fā)展,基于PC機(jī)的定位系統(tǒng)由于其價格及功耗較高已不能滿足社會發(fā)展的需要,脫離PC機(jī)的嵌入式定位技術(shù)迅速發(fā)展起來。
基于以上2點,本文提出以ARM器件為CPU,以嵌入式Linux為軟件內(nèi)核的GPS定位系統(tǒng),并對Linux下通用GPS接口的設(shè)計加以詳細(xì)闡述。ARM是當(dāng)前全球領(lǐng)先的16/32位RISC微處理器內(nèi)核,而Linux系統(tǒng)具有內(nèi)核小、功能強(qiáng)大、運(yùn)行穩(wěn)定、系統(tǒng)健壯、效率高及開源等諸多優(yōu)點。本設(shè)計解決了單獨的基于PC機(jī)的定位系統(tǒng)和基于WinCE的嵌入式定位系統(tǒng)成本高或攜帶不便的問題,系統(tǒng)性價比高,可彌補(bǔ)傳統(tǒng)定位系統(tǒng)的不足。
2 GPS定位原理與通信格式
2.1 GPS定位原理
按目前的方案,全球定位系統(tǒng)的空間部分用24顆高度約2.02×104 km的衛(wèi)星組成衛(wèi)星星座。21+3顆衛(wèi)星均為近圓形軌道,運(yùn)行周期約為11 h 58 min,分布在6個軌道面上(每軌道面4顆),軌道傾角為55°。衛(wèi)星的分布使得在全球的任何地方、任何時間都可觀測到4顆以上的衛(wèi)星,并能保持良好定位解算精度的幾何圖形(DOP)。這就提供了在時間上連續(xù)的全球?qū)Ш侥芰Α?/p>
GPS的基本定位原理是:衛(wèi)星不間斷地發(fā)送自身的星歷參數(shù)和時間信息,用戶接收到這些信息后,經(jīng)過計算求出接收機(jī)的三維位置、三維方向以及運(yùn)動速度和時間信息,如圖1所示。
圖1 GPS定位原理
其中:
((x1-x)2+(y1-y)2+(z1-z)2)12+
c·(t-t01)=d1
((x2-x)2+(y2-y)2+(z2-z)2)12+
c·(t-t02)=d2
((x3-x)2+(y3-y)2+(z3-z)2)12+
c·(t-t03)=d3
((x4-x)2+(y4-y)2+(z4-z)2)12+
c·(t-t04)=d4(1)
由于含有接收機(jī)衛(wèi)星鐘的誤差及大氣傳播誤差,GPS接收機(jī)對碼的量測就可得到衛(wèi)星到接收機(jī)的距離,故稱為偽距。對CA碼(Coarse-Acquisition Code,粗捕獲碼)測得的偽距稱為CA碼偽距,精度約為24 m,對P碼(Precise Code,精密碼)測得的偽距稱為P碼偽距,精度約為2 m。
2.2 GPS通信格式
目前,幾乎所有的GPS廠商都遵循美國國家海洋電子協(xié)會(National Marine Electronics Association)制定的NMEA-0183V20通信標(biāo)準(zhǔn)格式。GPS接收機(jī)的輸出語句按照串行通信協(xié)議,數(shù)據(jù)格式為8個數(shù)據(jù)位、1個起始位、1個停止位,無奇偶校驗位。本文中采用的數(shù)據(jù)傳輸?shù)牟ㄌ芈蕿? 600 b/s。其輸出語句采用的是NMEA0183即ASCII格式碼,包括GGA,GSA,RMC,GSV,RMC,RMT,VTG等。這些定位語句不僅給出了位置、速度、時間等信息,而且指出了當(dāng)?shù)氐男l(wèi)星接收情況。根據(jù)項目的實際需求,本設(shè)計只提取GGA數(shù)據(jù)。GGA數(shù)據(jù)的數(shù)據(jù)格式為:所有的信息由$開始,以換行結(jié)束,緊跟著$后的5個字符解釋了信息的基本類型,多重的信息之間用逗號隔開。其中
$GPGGA,hhmmss,XXXX.XXXX,N/S,
12 3
XXXXX.XXXX,E/W,X,XX,XXX,0/-XXXX,
4 56 7 89
M, 0/-XXX, M,XXX,XXXX *hh
101112 131415
(1)世界時(UTC):hh:時;mm:分;ss:秒。例如,北京時間(東八時區(qū))=UTC+8 h;
(2)緯度:“度度分分.分分分分”方式表示,小數(shù)點后也以分為單位;
(3)N:北緯;S:南緯;
(4)經(jīng)度:以“度度度分分.分分分分”方式表示。小數(shù)點后也以分為單位;
(5)E:東經(jīng);W:西經(jīng);
(6)GPS質(zhì)量指示。0:未定位;1:GPS定位;2:差分GPS定位;
(7)使用到的衛(wèi)星數(shù),可為0~12個。
(8)HDOP值:水平方向的定位精度劣化程度系數(shù)。三維定位時也會輸出HDOP值。但在未定位時輸出“099”。如果輸出語句的經(jīng)緯度輸出設(shè)置精度達(dá)不到1/10 000時,小數(shù)點后省略;
(9)天線高度,0:正數(shù),高于海平面;-:負(fù)數(shù),低于海平面;
(10)天線高度,單位為m;
(11)地理高度,0:正數(shù),高于海平面;-:負(fù)數(shù),低于海平面;
(12)地理高度,單位為m;
(13)DGPS修正經(jīng)過的時間。差分?jǐn)?shù)據(jù)時間單位為s;
(14)差分基準(zhǔn)站發(fā)播的ID編號;
(15)校驗和。
GPS命令格式為:
$PFST,,
命令行以$PFST開頭,后面跟著參數(shù),其中參數(shù)之間由逗號分隔開。GPS可以發(fā)送的數(shù)據(jù)如表1所示。
本設(shè)計中用到如下2個命令:
$PFST,START,0為發(fā)送命令使GPS模塊開始定位。
$PFST,NMEA,2000,9600為定義要發(fā)送的數(shù)據(jù),并設(shè)置通過串口傳輸?shù)牟ㄌ芈省?/p>
其中參數(shù)選擇2 000,即選擇了向串口發(fā)送GGA數(shù)據(jù)。
表1 GPS 基本命令
MessagebitMessagebit
GLL0x1000GGA0x2000
VTG0x4000RMC0x8000
GSA0x0002FOM0x0020
GSV0x0001PPS0x0010
Reserved0x0040
3 嵌入式Linux 通用GPS接口的實現(xiàn)
3.1 Linux 串行接口通信的設(shè)置與操作
3.1.1 串口初始化
本系統(tǒng)中,GPS模塊通過串口與Philip LPC2210嵌入式系統(tǒng)通信,處理器通過串口來獲得定位信息數(shù)據(jù)。Linux通過虛擬設(shè)備文件統(tǒng)一管理硬件設(shè)備,并將硬件設(shè)備的技術(shù)細(xì)節(jié)隱藏起來。內(nèi)核提供訪問設(shè)備文件的系統(tǒng)函數(shù),應(yīng)用程序通過調(diào)用這些函數(shù)完成對硬件的操作。對串口訪問控制的函數(shù)如表2所示,這些函數(shù)一起構(gòu)成了通用的終端控制接口,提供了對終端的有效的控制操作。
表2 串口訪問函數(shù)功能
函數(shù)描述
tcgetattr/tcsetattr獲取/設(shè)置終端屬性(termios結(jié)構(gòu))
cfgetispeed/cfsetispeed獲取/設(shè)置輸入速率
cfgetospeed/cfsetospeed獲取設(shè)置輸出速率
tcdrain等待所有輸出被傳送
tcflow暫停傳送或接受
tcflush丟棄隊列中尚未傳送或接受的數(shù)據(jù)
tcsendbreak發(fā)送BREAK字符
tcgetpgrp/tcsetpgrp獲取設(shè)置前臺的進(jìn)程組ID
在對串口操作之前,首先要對參數(shù)進(jìn)行初始化、設(shè)置它的屬性以保證通信雙方的通信參數(shù)保持一致,這些屬性定義在結(jié)構(gòu)體struct termios中,如下所示:
struct termios{
tcflag_t c_ iflag;
tcflag_t c_oflag;
tcflag_ t c_cflag;
tcflag_ t c_ lflag;
cc_ta_cc[NCCS];
}
其中,c_iflag成員用于控制輸入處理選項,它將影響到終端驅(qū)動程序在把輸入發(fā)送給程序前是否對其進(jìn)行處理,及怎樣對其進(jìn)行處理;成員c_oflag控制輸出處理過程;c_cflag包含對端口的設(shè)置,如波特率、字符位數(shù)、停止位等;存儲在成員c_iflag的本地模式標(biāo)志符決定是否顯示字符,是否發(fā)送信號到應(yīng)用程序等;數(shù)組c_cc包含控制字符的定義和超時參數(shù),在對struct.termios結(jié)構(gòu)體的各個成員賦值,調(diào)用tcsetattr()函數(shù)選擇新的設(shè)置完畢后,嵌入式Linux即可采用與普通文件的輸入/輸出相同的方式訪問串口。
3.1.2 Linux下的串口I/O操作
Linux對于串口資源采用“ttyS+編號”來命名,所有設(shè)備以設(shè)備文件的形式存儲在文件夾/dev中,其中每一個設(shè)備由一個主設(shè)備號和一個次設(shè)備號惟一確定。在Linux中串口設(shè)備被虛擬成文件,因此要訪問1個串口,只需打開相應(yīng)的設(shè)備文件,然后向這個文件讀寫數(shù)據(jù)就可以完成數(shù)據(jù)的接收和發(fā)送。首先調(diào)用open函數(shù)打開串口設(shè)備,使用完畢后用close函數(shù)關(guān)閉端口。使用的文件操作函數(shù)如下:
int open(coast char*pathname,int flags);
int close(int fd);
參數(shù)pathname指向欲打開的文件路徑字符串;參數(shù)flags為設(shè)置打開方式;open系統(tǒng)調(diào)用返回一個整形文件標(biāo)識符;以后所有的端口操作都針對這個標(biāo)識符進(jìn)行。close的參數(shù)fd為希望關(guān)閉的文件的標(biāo)識符[7-10]。
在完成串口配置,使用open函數(shù)打開串口后,調(diào)用read和write函數(shù)接收和發(fā)送數(shù)據(jù)。這兩個函數(shù)返回實際讀寫的字節(jié)數(shù),如果有錯誤發(fā)生,則返回-1。第一個參數(shù)為要讀/寫的文件標(biāo)識符,第二個參數(shù)為讀/寫緩存,第三個參數(shù)表示希望讀/寫的字節(jié)數(shù)。函數(shù)定義如下:
ssize_t read(int fd,void*buf,size_t count);
ssize_t write (int fd,const void*bufsize_t count);
3.2 基于中斷模式的GPS信號提取
中斷處理子函數(shù)主要用于處理串口接收到的數(shù)據(jù),由于GPS發(fā)送的數(shù)據(jù)類型都是以$符號開頭,所以首先應(yīng)檢測$符號,進(jìn)而進(jìn)行下一步的處理。
在此之前需要建立一個結(jié)構(gòu)體,用來保存GPS數(shù)據(jù),結(jié)構(gòu)體中包括數(shù)組Data[80],用來保存GPS數(shù)據(jù),數(shù)組長度設(shè)為80;還有一個狀態(tài)標(biāo)志位State,用于表示當(dāng)前的接收狀態(tài),State = 1表示已經(jīng)接收到$,State = 2表示已經(jīng)接收完1組GPS數(shù)據(jù),可以對數(shù)據(jù)進(jìn)行處理。State = 0表示還沒有接收到GPS信息。定義Data[GPSDataQWPTR] 表示第GPSDataQWPTR位數(shù)據(jù)。串口在接收GPS數(shù)據(jù)的時候需要判斷GPS數(shù)據(jù)的起始位和結(jié)束位,這一過程都在中斷處理子函數(shù)中實現(xiàn),具體的流程圖如圖2所示。
串口的中斷處理子函數(shù)起著非常關(guān)鍵的作用,一方面,它要處理來自于串口的緩沖區(qū)的GPS數(shù)據(jù),將串口中的數(shù)據(jù)寫入一個緩沖隊列中;另一方面,它還要負(fù)責(zé)與GPS_Handle()函數(shù)通信,通知GPS_Handle()任務(wù)開始對緩沖隊列中的數(shù)據(jù)進(jìn)行處理,將緩沖隊列中的數(shù)據(jù)寫入RAM中。根據(jù)$GPRMC數(shù)據(jù)格式,通過設(shè)置逗號計數(shù)器即可解算出經(jīng)、緯度等信息。
圖2 中斷處理子程序
4 結(jié) 語
GPS系統(tǒng)目前已廣泛應(yīng)用到社會的各個領(lǐng)域。Linux作為開源軟件,開發(fā)周期相對較短、內(nèi)核精簡、功能強(qiáng)大、運(yùn)行穩(wěn)定、系統(tǒng)健壯、效率高。其易于定制裁剪,內(nèi)核和用戶界面完全獨立。它非常靈活,各部分的可定制性都很強(qiáng)。正因為具有這些特性,為Linux在硬件資源有限的嵌入式領(lǐng)域提供了廣闊的舞臺。本文設(shè)計的基于嵌入式Linux平臺的GPS接口具有較強(qiáng)的通用性,可廣泛應(yīng)用于便攜式GPS系統(tǒng)中。
參考文獻(xiàn)
[1]何林遠(yuǎn),畢篤彥.嵌入式 Linux實時性的分析與研究\\.計算機(jī)應(yīng)用與軟件,2008,25(2):225-227.
[2]孫守昌,韓紅芳,孟煜.嵌入式Linux實時技術(shù)改進(jìn)與實現(xiàn)\\.微計算機(jī)信息,2007,23(12):67-69.
[3]任旭龍,周緯杰.基于嵌入式Linux操作系統(tǒng)內(nèi)核實時性的改進(jìn)方法研究\\.計算機(jī)工程與科學(xué),2006,28(1):125-127.
[4]周立功.ARM嵌入式系統(tǒng)基本教程[M].北京:北京航空航天大學(xué)出版社,2005.
[5]許海燕,付炎.嵌入式系統(tǒng)技術(shù)與應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2002.
[6]符意德.嵌入式系統(tǒng)設(shè)計原理及應(yīng)用[M].北京:清華大學(xué)出版社,2004.
[7]胃靜莊.嵌入式系統(tǒng)設(shè)計開發(fā)實例詳解基于ARM的應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2005.
[8]王田苗.嵌入式系統(tǒng)設(shè)計與實例開發(fā)[M].北京:清華大學(xué)出版社,2002.
[9]劉錚蓉,張智超,許振山,等.嵌入式Linux應(yīng)用技術(shù)詳解[M].北京:機(jī)械工業(yè)出版社,2004.
[10]Craig Hollabaugh.嵌入式Linux硬件、軟件與接口[M].陳雷,譯.北京:電子工業(yè)出版社,2003.
[11]馬忠梅,李善平,康慨.ARMLinux嵌入式系統(tǒng)教程[M].北京:北京航空航大大學(xué)出版社,2004.
[12]Karim Yaghmour.Building Embedded Linux Systems[M].New York:O′Reilly Press,2003.
作者簡介 李學(xué)斌 男,1956年出生,山西長治學(xué)院計算機(jī)系副教授。主要研究方向為計算機(jī)應(yīng)用。
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文