《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計(jì)應(yīng)用 > GPS模塊與ARM-Linux平臺(tái)數(shù)據(jù)傳送研究
GPS模塊與ARM-Linux平臺(tái)數(shù)據(jù)傳送研究
EEworld
EEworld
摘要: 本文主要研究GPS模塊與ARM-Linux平臺(tái)之間采用異步串行傳送方式進(jìn)行數(shù)據(jù)傳送的問題,利用多線程編程技術(shù)實(shí)...
Abstract:
Key words :

關(guān)鍵字:GPS模塊 ARM-Linux平臺(tái) 數(shù)據(jù)傳送

  本文主要研究GPS模塊與ARM-Linux平臺(tái)之間采用異步串行傳送方式進(jìn)行數(shù)據(jù)傳送的問題,,利用多線程編程技術(shù)實(shí)現(xiàn)GPS信號(hào)采集與處理,,并介紹了一種WGS坐標(biāo)向地方坐標(biāo)的轉(zhuǎn)換方法,。與GPS通信可選的協(xié)議有很多種,目前普遍采用的是NMEA-0183通信協(xié)議,。

  1 NMEA-0183通信協(xié)議

  NMEA-0183協(xié)議[1]是為了在不同的GPS導(dǎo)航設(shè)備中建立統(tǒng)一的海事無線電技術(shù)委員會(huì)(BTCM)標(biāo)準(zhǔn),,由美國(guó)國(guó)家海洋電子協(xié)會(huì)NMEA(National Marine Electronics Association)制定的通信協(xié)議,其中規(guī)定了海用和陸用GPS接收設(shè)備輸出的定位位置數(shù)據(jù),、時(shí)間,、衛(wèi)星狀態(tài)、接收機(jī)狀態(tài)等信息,。除NMEA-0183協(xié)議之外,,還有差分用的RTCMSC-104格式,各個(gè)廠商互不兼容的二進(jìn)制格式等,,但以NMEA-0183使用最廣泛,。為實(shí)現(xiàn)ARM-LINUX平臺(tái)與GPS之間的通信,應(yīng)清楚協(xié)議規(guī)定的GPS輸出的數(shù)據(jù)格式和報(bào)文。NMEA-0183規(guī)定的格式如下:

  波特率:4 800 b/s

  數(shù)據(jù)位:8 bit

  奇偶校驗(yàn):無

  開始位:1 bit

  停止位:1 bit

  報(bào)文格式:報(bào)文的語句串(十進(jìn)制ASCII碼)格式全部信息如圖1,。

   圖1中具體內(nèi)容:$為串頭,,表示串開始;GP為交談識(shí)別符。XXX為語句名,,NMEA規(guī)定的常用語句有以下6種:GGA,,衛(wèi)星定位信息;GLL,地理位置-經(jīng)度和緯度;GSA,,GNSS DOP偏差信息,,說明衛(wèi)星定位的信號(hào)的優(yōu)劣情況;GSV,GNSS天空范圍內(nèi)的衛(wèi)星;RMC,,最基本的GNSS信息,,指能夠達(dá)到定位目的的基本信息等語句。ddd為數(shù)據(jù)字段,,字母或數(shù)字,,“,”為域分隔符;*表示串尾;hh表示$與*之間所有字符代碼的校驗(yàn)和;為回車控制符;為換行控制符,。

  在實(shí)際的GPS應(yīng)用中,,并不會(huì)用到NMEA的全部信息,而是根據(jù)具體的需要,,從中選取有用的信息,,忽略其余的信息內(nèi)容。下面以GPRMC語句為例來介紹,。該語句包含時(shí)間,、日期、方位,、速度和磁偏角等信息,,基本上可以滿足一般的導(dǎo)航需求。GPRMC語句的結(jié)構(gòu)為:$GPRMC,,<1>,,<2>,<3>,,<4>,,<5>,<6>,,<7>,,<8>,<9>,,<10>,,<11>,,*hh。

  數(shù)據(jù)區(qū)說明如下:

  (1)UTC時(shí)間,,hhmmss.sss(時(shí)分秒.毫秒)格式;

  (2)定位狀態(tài),,A=有效定位,V=無效定位;

  (3)緯度ddmm.mmmm (度分)格式(前面的0也將被傳輸);

  (4)緯度半球N(北半球)或S(南半球);

  (5)經(jīng)度dddmm.mmmm(度分)格式(前面的0也將被傳輸);

  (6)經(jīng)度半球E(東經(jīng))或W(西經(jīng));

  (7)地面速率(000.0~999.9節(jié),,前面的0也將被傳輸);

  (8)地面航向(000.0~359.9度,,以真北為參考基準(zhǔn),前面的0也將被傳輸);

  (9)UTC日期,,ddmmyy(日月年)格式;

  (10)磁偏角(000.0~180.0度,,前面的0也將被傳輸);

  (11)磁偏角方向,E(東)或W(西),。

  2 目標(biāo)平臺(tái)

  本文中使用的是以SAMSUNG公司的ARM9系列中的16/32位RISC處理器S3C2410A芯片為核心的目標(biāo)平臺(tái),。S3C2410A包含一個(gè)16/32位的RISC(ARM920T)CPU內(nèi)核、獨(dú)立的16 KB的指令和16 KB數(shù)據(jù)緩存(cache),、用于虛擬內(nèi)存管理的MMU單元、LCD控制器(STN&TFT),、非線性(NAND)Flash,、系統(tǒng)管理器(包括片選邏輯控制和SDRAM控制器)及3個(gè)通道的異步串口(UART)。目標(biāo)板資源包括S3C2410的微處理器,,主頻200 MHz;16 MB的Flash;64 MB的SDRAM;RS-232C UART接口;LCD液晶顯示屏,。

  在目標(biāo)板上選配的GPS模塊是HIMARK公司的GPS模塊,此模塊是符合民用標(biāo)準(zhǔn)的GPS接收器,,信號(hào)接收性能好,,功耗較小,整體工作比較穩(wěn)定,。整體硬件設(shè)計(jì)框圖如圖2所示,。

  

3 交叉編譯環(huán)境的建立

  基于嵌入式Linux操作系統(tǒng)的應(yīng)用開發(fā)模式通常都是宿主機(jī)+目標(biāo)機(jī)[2]。目標(biāo)機(jī)用于運(yùn)行操作系統(tǒng)和系統(tǒng)應(yīng)用軟件,,而目標(biāo)板所用到的操作系統(tǒng)的內(nèi)核編譯,、應(yīng)用程序的開發(fā)和調(diào)試則需要通過宿主機(jī)(資源豐富處理能力強(qiáng)的PC)來完成,稱之為交叉編譯,。雙方之間一般通過串口,、并口或以太網(wǎng)接口建立連接關(guān)系。

  (1)配置minicom:在宿主機(jī)Redhat Linux 9.0的X windows界面下新建終端,,在終端命令提示符后輸入minicom-s,,回車,然后按照提示設(shè)置波特率115200,,8位數(shù)據(jù),,1位停止位,,無流控,保存退出,。

  (2)TFTP服務(wù)的配置:在終端中運(yùn)行setup->system service->tftp增加TFTP服務(wù),,并去掉ipchains和iptables 兩項(xiàng),然后在Firewall configuration,,選中no firewall,,保存退出,執(zhí)行service xinetd restart啟動(dòng)TFTP服務(wù),。

  (3)NFS服務(wù)器的配置:在終端中運(yùn)行setup->system service->NFS,,增加NFS服務(wù),然后編輯文件exports,,添加與目標(biāo)機(jī)共享的目錄,,并設(shè)置目標(biāo)機(jī)對(duì)目錄的訪問權(quán)限,重新啟動(dòng)NFS服務(wù),。

  (4)Linux內(nèi)核移植:通過并口,,宿主機(jī)向目標(biāo)開發(fā)板的Flash燒寫引導(dǎo)程序ppcboot,燒寫完畢后通過TFTP服務(wù)把經(jīng)過裁剪的Linux內(nèi)核鏡像文件以及根文件系統(tǒng)下載到目標(biāo)板的RAM中,,然后由ppcboot完成內(nèi)核及根文件系統(tǒng)從內(nèi)存到Flash的燒寫,。最后需要在宿主機(jī)安裝主編譯器Arm-linux-gcc,用來交叉編譯應(yīng)用程序,。

  4 GPS信號(hào)的采集和處理

  為實(shí)現(xiàn)ARM-Linux平臺(tái)下GPS信號(hào)的采集與處理,,涉及到Linux下串口編程技術(shù),首先給出Linux串口通信的原理,,然后利用多線程編程技術(shù)來完成GPS數(shù)據(jù)采集與NMEA數(shù)據(jù)格式的解析,,因解析后得到的GPS定位坐標(biāo)屬于WGS84坐標(biāo),需轉(zhuǎn)換到相應(yīng)的54,、80坐標(biāo)或地方坐標(biāo)供用戶標(biāo)圖定位所用,,因此介紹了一種坐標(biāo)轉(zhuǎn)換方法。

  4.1 GPS數(shù)據(jù)采集與處理

  大多數(shù)GPS接收機(jī)與各種處理器平臺(tái)進(jìn)行數(shù)據(jù)交換時(shí),,都采用異步串行傳送方式,,提供一個(gè)符合RS-232C電氣標(biāo)準(zhǔn)的數(shù)據(jù)接口。

  在Linux操作系統(tǒng)中,,所有設(shè)備以設(shè)備文件的形式存儲(chǔ)在目錄/dev/下,,串口設(shè)備文件為/dev/ttyS*,在Linux中,,若要設(shè)置串口的參數(shù),,如改變串口的波特率、字符大小等,,可通過POSIX標(biāo)準(zhǔn)終端接口[3],,該接口被稱為termios,,在系統(tǒng)頭文件中定義。它包括一個(gè)數(shù)據(jù)結(jié)構(gòu)和一系列操縱這些數(shù)據(jù)結(jié)構(gòu)的函數(shù)組成,。有關(guān)串口的所有參數(shù)配置都保存在接口termios的結(jié)構(gòu)struct termios中,,該結(jié)構(gòu)定義如下:

  struct termios

  {

  tcflag_t c_iflag; /*輸人模式標(biāo)志*/

  tcflag_t c_oflag; /*輸出模式標(biāo)志*/

  tcflag_t c_cflag; /*控制模式標(biāo)志*/

  tcflag_t c_lflag; /*本地模式標(biāo)志*/

  cc_t c_cc[NCCS];/*特殊控制字符*/

  }

  其中的c_iflag成員是用來控制輸入處理選項(xiàng)的,它影響到終端驅(qū)動(dòng)程序?qū)⑤斎氚l(fā)送給程序前是否對(duì)其進(jìn)行處理,,及怎樣對(duì)其進(jìn)行處理,。c_oflag成員是用來控制輸出數(shù)據(jù)的處理,并決定在發(fā)送輸出數(shù)據(jù)到顯示屏和其他輸出設(shè)備之前,,終端驅(qū)動(dòng)程序是否以及如何來處理它們,。c_cflag用于存放各種決定終端設(shè)備硬件特性的控制標(biāo)志,如串口的波特率,、奇偶校驗(yàn),、停止位、數(shù)據(jù)位等,。存放在c_lflag 中的本地模式標(biāo)志用來操縱串口如何處理輸入字符,,比如是否將輸入字符顯示到顯示屏上,一般可通過此成員來設(shè)置串口為正規(guī)模式或是非正規(guī)模式,。c_cc數(shù)組成員用來定義支持的特殊控制字符以及一些timeout參數(shù),。

  除了上面的這個(gè)包含串口參數(shù)配置的數(shù)據(jù)結(jié)構(gòu)之外,termios中還包含許多控制串口特性的函數(shù),。其中重要的幾個(gè)函數(shù)如:tegetattr( )、tesetattr( ),、cfsetispeed( ),、cfsetospeed( )、tcflush( ),。tegetattr( )用來初始化一個(gè)termios數(shù)據(jù)結(jié)構(gòu),,之后可使用其他的函數(shù)來操縱由tegetattr( )返回的數(shù)據(jù)結(jié)構(gòu)。完成這些操作后,,使用tesetattr( )來更新串口的設(shè)置,。cfsetispeed( )用來設(shè)置串口的輸入速度。cfsetospeed( )用來設(shè)置串口的輸出速度,。tcflush( )用來清除所有隊(duì)列在串口的輸入與輸出,。

  在Linux下采用多線程編程技術(shù)可大大節(jié)省系統(tǒng)的開銷,方便各線程之間通信,,提高應(yīng)用程序的響應(yīng),,改善程序結(jié)構(gòu),從而可以提高嵌入式系統(tǒng)的性能,。本文就是利用Linux下多線程編程來實(shí)現(xiàn)GPS數(shù)據(jù)的采集和處理,,在GPS模塊的初始化GPS_Initial函數(shù)中創(chuàng)建接收線程GPS_Thread_Port_Svc,,在接收線程中調(diào)用GPS信息語句的解析函數(shù)GPS_Parse_Data(buf_GPS,&gps_data),,進(jìn)一步調(diào)用語句字符串解析函數(shù)

  GPS_Parse_Data_Line(char*str_gprs_data_line,,GPS_DATA_TYPE*GPS_DATA)。在GPS語句的處理過程中,,需對(duì)所讀取的語句進(jìn)行鑒別區(qū)分,,只選取其中要用的信息進(jìn)行處理而忽略其余的信息,這就要根據(jù)NMEA-0183協(xié)議中規(guī)定的語句格式來進(jìn)行解析,。圖3給出了GPS數(shù)據(jù)處理流程,。

GPS數(shù)據(jù)處理流程

下面是程序?qū)崿F(xiàn)的關(guān)鍵函數(shù)部分代碼。

   /*包含必要的頭文件*/

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  int GPS_Initial(int n_tty_no)

  {

  int ret_tty=-1;

  int ret_thread=-1;

  ret_tty=OpenComPort(n_tty_no,,9600,,8,“1”,,‘N’);/*打開串口,,并設(shè)置通信屬性,如波特率,,數(shù)據(jù)位,,有無奇偶校驗(yàn),停止位等*/

  ret_thread=pthread_create(&pthr_id,,NULL,,GPS_

  Thread_Port_Svc,NULL);/*創(chuàng)建接收線程*/

  …

  }

  void*GPS_Thread_Port_Svc(void*pData)

  {/*接收線程函數(shù)*/

  unsigned char buf_GPS[256];

  int ret_rd_com;

  while(1) {

  bzero(buf_GPS,,sizeof(buf_GPS));

  ret_rd_com=ReadComPort((void*)buf_GPS,,

  sizeof(buf_GPS));/*讀串口,接收數(shù)據(jù)*/

  GPS_Parse_Data(buf_GPS,,&gps_data);

  /*調(diào)用解析語句函數(shù),,*/

  …}

  在GPS_Parse_Data(buf_GPS,&gps_data)函數(shù)中每接收一個(gè)GPS語句,,調(diào)用一次字符串解析函數(shù),。

  GPS_Parse_Data_Line(char*str_gprs_data_line,GPS_DATA_TYPE*GPS_DATA){

  char*temptr;

  temptr=str_gprs_data_line;

  /*字符串賦給臨時(shí)指針,,然后對(duì)其解析*/

  if(strncmp(temptr,,RMC_DATA_L,strlen(RMC_DATA_L))==0) {/*解析RMC語句串*/

  startchar(temptr,,',,');

  temptr=temptr+strlen(temptr)+12;

  /*$GPRMC,HHMMSS.SSS*/

  GPS_DATA->Time.Flag=temptr[0];

  temptr=temptr+27;

  /*A,,DDMM.MMMM,,N,,DDDMM.MMMM,E*/

  …}

  以上只是GPS信息處理的部分代碼,。經(jīng)過交叉編譯調(diào)試下載至目標(biāo)平臺(tái)上,,運(yùn)行后可得到本地地理位置信息。實(shí)驗(yàn)所得數(shù)據(jù)為:時(shí)間10:28:35;緯度:北緯30°46’;經(jīng)度:東經(jīng)103°57’,。用戶也可以根據(jù)需要選擇提取GPS的其他語句,,只需編寫解析相應(yīng)語句字符串的代碼即可。

4.2 GPS坐標(biāo)的轉(zhuǎn)換

  上述所得的結(jié)果屬于WGS84坐標(biāo),,而在工程上實(shí)用的大多是國(guó)家坐標(biāo)系,,因此GPS數(shù)據(jù)采集結(jié)果的使用就存在與國(guó)家坐標(biāo)系間的坐標(biāo)轉(zhuǎn)換問題。一般要通過兩步轉(zhuǎn)換:首先將上述實(shí)測(cè)經(jīng)緯度坐標(biāo)即WGS84大地坐標(biāo)(L,,B)轉(zhuǎn)換為對(duì)應(yīng)于WGS84橢球的高斯平面坐標(biāo)(X84,,Y84),然后再經(jīng)過平面坐標(biāo)轉(zhuǎn)換,,將高斯平面坐標(biāo)(X84,,Y84)強(qiáng)制附合到本地高斯平面坐標(biāo)系統(tǒng)[4]。

  (1)高斯投影換算

  將GPS采集所得出的大地坐標(biāo)(L,,B)轉(zhuǎn)換為高斯平面坐標(biāo)(X84,,Y84)。有關(guān)的推導(dǎo)過程較復(fù)雜,,本文只給出結(jié)果:

   由上述原理利用EXCEL就可以算出對(duì)應(yīng)的高斯平面坐標(biāo),。

  (2)平面坐標(biāo)轉(zhuǎn)換

  平面坐標(biāo)轉(zhuǎn)換的目的就是將高斯投影換算得出平面坐標(biāo)(X84,Y84)轉(zhuǎn)換為當(dāng)?shù)貒?guó)家坐標(biāo)系的平面坐標(biāo),。下面介紹一種平均轉(zhuǎn)軸相似轉(zhuǎn)換法,,以轉(zhuǎn)換為北京54坐標(biāo)系下的平面坐標(biāo)(X54,Y54)為例,,說明該方法實(shí)現(xiàn)過程。

  首先,,根據(jù)公共點(diǎn)分別在WGS84和北京54系中的高斯平面坐標(biāo),,求出該點(diǎn)在兩個(gè)坐標(biāo)系中同一邊的方位角之差?駐?琢和長(zhǎng)度比例系數(shù)?資,然后按下式計(jì)算任一點(diǎn)在北京54系中的平面坐標(biāo),。

   將得到的X54,,Y54坐標(biāo)可應(yīng)用于GIS系統(tǒng)標(biāo)圖,實(shí)現(xiàn)導(dǎo)航定位,。

  基于NMEA-0183通信協(xié)議,,在Linux下通過多線程編程實(shí)現(xiàn)了GPS基本定位信息的采集與處理,所得數(shù)據(jù)滿足精度要求,,為導(dǎo)航定位系統(tǒng)或GIS系統(tǒng)提供了數(shù)據(jù)基礎(chǔ),。

 

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。