摘 要:隨著移動終端的普及,嵌入式Linux系統(tǒng)越來越得到廣泛的應(yīng)用,同時作為定位領(lǐng)域最為常用的GPS信號,也需要逐步應(yīng)用到基于Linux的移動便攜終端中來,使得各種移動終端的位置信息更加可靠,同時使得各設(shè)備之間互聯(lián)及數(shù)據(jù)傳輸變得高效和方便,本文旨在設(shè)計一款基于Linux+ARM的GPS通信模塊。
關(guān)鍵詞:嵌入式;Linux;GPS;ARM
中圖分類號:TP391 文獻標(biāo)識碼:A
Abstract:With the popularity of mobile terminal,embedded Linux system,more and more widely used,at the same time as the location of most commonly used GPS signal,also need to gradually applied to Linux mobile portable terminal based on,makes a variety of mobile terminal location information more reliable,at the same time between each equipment interconnection and data transmission more efficient and convenient.The aim of this paper is to design a GPS communication module based on Linux+arm is being paid.
Keywords:embedded;Linux;GPS;ARM
1 引言(Introduction)
何謂GPS呢,就是全球定位系統(tǒng),英文為Global Positioning System。換言之,是一個由覆蓋全地球的24顆衛(wèi)星組成的衛(wèi)星定位系統(tǒng)。此項技術(shù)可作為航空器、船只、汽車和人的定位和導(dǎo)向,能夠較為安全和準(zhǔn)確地沿著既定的路線,準(zhǔn)確的到達所需目的地。美國主導(dǎo)的全球定位系統(tǒng)簡稱GPS,是20世紀70年代末期美軍三軍聯(lián)合研制的醫(yī)用衛(wèi)星來進行導(dǎo)航和定位的系統(tǒng)。它研制的主要目的是為三軍的三個大的領(lǐng)域提供全球性、長時間的和實時的導(dǎo)航和定位信號,還可用于軍事情報的收集、核爆炸的監(jiān)測和應(yīng)急通訊等,是美國控制全球戰(zhàn)略的重要組成部分之一。歷經(jīng)30多年的發(fā)展和壯大,消耗資金超過400億美金,至今其全球覆蓋率已經(jīng)達到99%的二十余顆GPS衛(wèi)星都已經(jīng)全部布置完成。上述GPS全球衛(wèi)星定位系統(tǒng)主要由以下幾大部分構(gòu)成,它們是空間部分,即GPS星座,地面控制部分,即地面監(jiān)控系統(tǒng),用戶終端接收設(shè)備部分,即GPS信號接收器[1]。
2 定位系統(tǒng)的構(gòu)成(Composition of positioning system)
2.1 定位系統(tǒng)的三大構(gòu)成部分
地球周邊太空空間部分,定位系統(tǒng)需要21顆工作衛(wèi)星組成,后備的衛(wèi)星為三顆。地球上的后臺支撐系統(tǒng),主要有一個主控站點、三個注入站點、五個監(jiān)測站點共同組成。終端用戶的信號接收設(shè)備部分,用來接收GPS衛(wèi)星所發(fā)射來的信號,來獲取所需的導(dǎo)航和定位數(shù)據(jù),經(jīng)過信號的分析和處理,從而來實現(xiàn)導(dǎo)航和定位的目的。本定位系統(tǒng)的接收機硬件主要由主控機、天線和電源部分所構(gòu)成。
2.2 全球定位系統(tǒng)的定位思路
依據(jù)高速運動的衛(wèi)星瞬時的位置作為已知的初始數(shù)據(jù),來達到定位的目的,利用空間距離后方交會的方式,從而來確定待檢測點的位置數(shù)據(jù)。當(dāng)前定位系統(tǒng)所提供的定位精度是9米以內(nèi),誤差較大,為了提高定位的精度,經(jīng)常利用差分的定位技,在基準(zhǔn)站點之上安放一臺GPS接收器進行檢測。依據(jù)該基準(zhǔn)站點的精準(zhǔn)坐標(biāo)值,來計算出衛(wèi)星到基準(zhǔn)站點的距離誤差修正數(shù)據(jù),然后由基準(zhǔn)站點把此數(shù)據(jù)實時發(fā)送至終端用戶。終端接收器進行系統(tǒng)定位檢測的時候,同時接收到基準(zhǔn)站點所發(fā)來的修正數(shù)據(jù),綜合對定位結(jié)果數(shù)據(jù)進行修正,從而來提高定位精度。差分定位系統(tǒng)主要分兩大類,它們是偽距差分和載波相位差分[2]。偽距差分的思想,該方法是應(yīng)用最為廣泛的差分方式。即在基準(zhǔn)站點之上,檢測所有衛(wèi)星數(shù)據(jù),依據(jù)基準(zhǔn)站已有的坐標(biāo)數(shù)據(jù)和諸衛(wèi)星的坐標(biāo)數(shù)值,解出每顆衛(wèi)星在每一個時刻距離基準(zhǔn)站點的實際距離值。然后與測得的偽距離相比較之后,計算出偽距修正數(shù),把它發(fā)送至用戶終端接收器,以此來提高定位精度。此差分方式,能得到米級定位精度,例如,我國開放地區(qū)大量應(yīng)用的信標(biāo)差分。載波相位差分思路,該差分技術(shù)簡稱RTK,即Real Time Kinematic,是及時計算若干個測站載波相位觀測值的差分方式。就是把基準(zhǔn)站點采樣到的數(shù)據(jù)發(fā)送給終端用戶接收器,從而來求解坐標(biāo)值。此方式能使定位精度達到厘米級。其廣泛應(yīng)用在需要高精度定位的領(lǐng)域。此方式經(jīng)歷了十多年的發(fā)展,隨著GPS技術(shù)的不斷改良,該系統(tǒng)的軟件和硬件技術(shù)也在不斷完善,不斷的拓展其應(yīng)用領(lǐng)域,至今已經(jīng)遍及經(jīng)濟社會的各個領(lǐng)域,同時逐步深入到老百姓的日常生活當(dāng)中。本全球定位系統(tǒng)的強大的作用還會繼續(xù)方便人們的生活[3]。
3 GR-87模塊介紹(GR-87 module introduction)
該模塊與MCU的接口是普通TTL電平串口,非常方便。另外模塊使用SiRF第二代高效能晶片,大大縮小體積。快速定位及追蹤23顆衛(wèi)星的能力。晶片內(nèi)建1920次/頻率硬體,提高接收傳送搜尋衛(wèi)星信號。GR-87模塊輸出的數(shù)據(jù)格式遵循標(biāo)準(zhǔn)GPS接收機定位的數(shù)據(jù)格式——“NMEA-0183”數(shù)據(jù)格式。
4 具體實現(xiàn)步驟(Specific implementation steps)
(1)插上GPS模塊后上電,啟動開發(fā)平臺
用普通交叉串口線連接開發(fā)平臺的DBGU串口到PC的串口,用USB電纜連接開發(fā)平臺的USB Slave口到PC,使用網(wǎng)線可以連接開發(fā)平臺的100M網(wǎng)卡到PC的網(wǎng)口。
(2)使用時要注意GPS模塊串口的波特率
程序所要做的工作是通過串口從GR-87模塊接收數(shù)據(jù)然后進行分析,得到經(jīng)緯度,時間等信息。部分核心代碼如下:
int main(int argc,char *argv[])
{int i;char huanchong[GPS_RECV_CMD_MAX_BUF];//receive huanchong
char tmp;XINXI xinxi;char Jiaodu[4];
char Fenzhong[8];char Shizhong[4];char Minu[4];
char Miao[4];char Zhuangtaishu[4];int number=0;//open the COM
bsp_init();int recv_count;rs485_open();
printf("test GPS...\r\n");while(1){while(!Is_startGP(fd_rs485));
for(i=0;i<256;i++){read(fd_rs485,&tmp,1);huanchong[i]=tmp; if(tmp=='\n')break;}
if(Is_GGA(huanchong)){xinxi.bIsGPGGA=1;number=6;
for(i=0;i<4;i++) Shizhong[i]=0;
Shizhong[0]=huanchong[number];Shizhong[1]=huanchong[number+1];number += 2;for(i=0;i<4;i++)Minu[i]=0;
Minu[0]=huanchong[number];Minu[1]=huanchong[number+1];number+=2;for(i=0;i<4;i++)Miao[i]=0;
Miao[0]=huanchong[number];Miao[1]=huanchong[number+1];xinxi.shizhong=atoi(Shizhong);
xinxi.min=atoi(Minu);xinxi.sec=atoi(Miao);
xinxi.secFrac=0;xinxi.bjshizhong=xinxi.shizhong+8;
if(xinxi.bjshizhong>24)xinxi.bjshizhong-=24;number=17;
for(i=0;i<4;i++)
Jiaodu[i]=0;Jiaodu[0]=huanchong[number];Jiaodu[1]=
huanchong[number+1];number+=2;for(i=0;i<8;i++)Fenzhong[i]=0;
for(i=0;i<7;i++)Fenzhong[i]=huanchong[number+i];
xinxi.latitude=(atof(Fenzhong))/60.0 + atoi(Jiaodu);
xinxi.latNS=huanchong[27];number=29;
for(i=0;i<4;i++)Jiaodu[i]=0;
Jiaodu[0]=huanchong[number];Jiaodu[1]=huanchong[number+1];Jiaodu[2]=huanchong[number+2];number+=3;for
(i=0;i<8;i++) Fenzhong[i]=0;
for(i=0;i<7;i++)Fenzhong[i]=huanchong[number+i];
xinxi.longitude=(atof(Fenzhong))/60.0+atoi(Jiaodu); xinxi.lgtEW=huanchong[40];number=44;
for(i=0;i<4;i++)Zhuangtaishu[i]=0;Zhuangtaishu[0]=huanchong[number];Zhuangtaishu[1]=huanchong[number+1];xinxi.satellites=atoi(Zhuangtaishu);
printf("UTC Time:%d h%d m%d s\n",xinxi.shizhong,xinxi.min,xinxi.sec);
printf("BJ Time:%d h%d m%d s\n",xinxi.bjshizhong,xinxi.min,xinxi.sec);
printf("Latitude:%c wei %f\n",xinxi.latNS,xinxi.latitude);
printf("Longitude:%c jing %f\n",xinxi.lgtEW,xinxi.longitude);
printf("Satellites:%d\n",xinxi.satellites);printf("\n");
}else continue;sleep(1);}return 0;}
(3)編譯生成目標(biāo)代碼下載至目標(biāo)板然后運行調(diào)試
直接使用arm-linux-gcc命令進行編譯,也可先編好Makefile文件,然后用make命令編譯。我們采用后一種方法,較規(guī)范。
(4)運行之前先進行如下操作
①cd dev;②mkdir tts;③ln–s/dev/tq2440_serial1/dev/tts/1然后運行目標(biāo)程序,調(diào)試發(fā)送和接受數(shù)據(jù)。
5 結(jié)論(Conclusion)
本文是作者在多年從事Linux和嵌入式ARM開發(fā)的實踐過程中,就基于Linux+ARM的GPS模塊的開發(fā)所得到的一點心得體會,希望對讀者有所幫助,由于本人能力有限,技術(shù)細節(jié)不夠完善,尚未實現(xiàn)多GPS模塊的多點通訊,沒能把GPS模塊驅(qū)動程序加載至Linux內(nèi)核中開機自動運行,不足之處,希望讀者朋友多多的指正。
參考文獻(References)
[1] 田世君.高靈敏度GPS定位及組合導(dǎo)航技術(shù)研究[D].電子科技大學(xué),2009.
[2] 唐康華.GPS/MIMU嵌入式組合導(dǎo)航關(guān)鍵技術(shù)研究[D].國防科學(xué)技術(shù)大學(xué),2008.
[3] 公磊.基于Android的GPS測量系統(tǒng)開發(fā)[D].南昌大學(xué),2008.
作者簡介:
周小仨(1980-),男,碩士,講師.研究領(lǐng)域:嵌入式,EDA,單片機技術(shù)開發(fā).