天天干夜夜弄_黄毛片网站_2012中文版免费观看_久操视频在线_欧美日韩一区二区电影_日韩av片在线免费观看

  • Cehui8.com 測繪地理信息領域專業門戶
  • 首頁 > 測繪論文 > GPS/北斗

    VC++實現GPS全球定位系統定位數據的提取

    2013-07-08 21:49:55 來源:  作者:
    聊聊

    引言   
            衛星導航技術的飛速發展已逐漸取代了無線電導航、天文導航等傳統導航技術,而成為一種普遍采用的導航定位技術,并在精度、實時性、全天候等方面取得了長足進步。現不僅應用于物理勘探、電離層測量和航天器導航等諸多民用領域,在軍事領域更是取得了廣泛的應用--在彈道導彈、野戰指揮系統、精確彈道測量以及軍用地圖快速測繪等領域均大量采用了衛星導航定位技術。有鑒于衛星導航技術在民用和軍事領域的重要意義,使其得到了許多國家的關注。我國也于20001031日和1221日成功發射了第一顆和第二顆導航定位試驗衛星并建立了我國第一代衛星導航定位系統--"北斗導航系統",但由于起步晚也沒有得到廣泛應用。目前在我國應用最多的還是美國的GPS系統。本文就針對當前比較普及的GPS系統,對其衛星定位信息的接收及其定位參數提取的實現方法予以介紹。

      定位信息的接收
      通常GPS定位信息接收系統主要由GPS接收天線、變頻器、信號通道、微處理器、存儲器以及電源等部分組成。由于GPS定位信息內容較少,因此多用RS-232串口將定位信息(NEMA0183語句)從GPS接收機傳送到計算機中進行信息提取處理。從串口讀取數據有多種方法,在此直接使用 Win32 API函數對其進行編程處理。在Windows下不允許直接對硬件端口進行控制操作,所有的端口均被視為"文件",因此在對串口進行偵聽之前需要通過打開文件來打開串口,并對其進行相關參數配置:
    m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); file://以異步方式打開COM1

    SetCommMask (m_hCom, EV_RXCHAR ) ; file://添加或修改Windows所報告的事件列表

    SetupComm (m_hCom,READBUFLEN/*讀緩沖*/,WRITEBUFLEN/*寫緩沖*/); // 初始化通訊設備參數 

    // 清除緩沖信息

    PurgeComm (m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;
    // 對異步I/O進行設置

    CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; file://接收兩連續字節的最大時間間隔

    CommTimeOuts.ReadTotalTimeoutMultiplier =0; file://接收每字節的平均允許時間 

    CommTimeOuts.ReadTotalTimeoutConstant = 0 ; file://接收時間常數

    SetCommTimeouts (m_hCom , &CommTimeOuts) ;
    file://獲取并設置串口

    GetCommState ( m_hCom, &dcb) ;
    dcb.BaudRate = CBR_4800;
    dcb.ByteSize = 8;
    dcb.Parity = ODDPARITY;
    dcb.StopBits = ONESTOPBIT ; 
    SetCommState( m_hCom, &dcb); 
      在成功打開并設置通訊口后,可采取輪詢串口和事件觸發兩種方式對數據進行接收處理,本文在此采取效率比較高的事件觸發方式進行接收處理,通過等待EV_RXCHAR事件的發生來啟動ReadFile函數完成對GPS定位信息的接收:
    while(true){
     WaitCommEvent (m_hCom,&dwEvtMask,NULL); 
     if (dwEvtMask&EV_RXCHAR == EV_RXCHAR)
      if(ComStat.cbInQue>0) 
       ReadFile(m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead);
    } 
      提取定位數據
      GPS接收機只要處于工作狀態就會源源不斷地把接收并計算出的GPS導航定位信息通過串口傳送到計算機中。前面的代碼只負責從串口接收數據并將其放置于緩存,在沒有進一步處理之前緩存中是一長串字節流,這些信息在沒有經過分類提取之前是無法加以利用的。因此,必須通過程序將各個字段的信息從緩存字節流中提取出來,將其轉化成有實際意義的,可供高層決策使用的定位信息數據。同其他通訊協議類似,對GPS進行信息提取必須首先明確其幀結構,然后才能根據其結構完成對各定位信息的提取。對于本文所使用的GARMIN GPS天線板,其發送到計算機的數據主要由幀頭、幀尾和?葑槌桑???葜〉牟煌??芬膊幌嗤????$GPGGA""$GPGSA""$GPGSV"以及"$GPRMC"等。這些幀頭標識了后續幀內數據的組成結構,各幀均以回車符和換行符作為幀尾標識一幀的結束。對于通常的情況,我們所關心的定位數據如經緯度、速度、時間等均可以從"$GPRMC"幀中獲取得到,該幀的結構及各字段釋義如下:
      $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh
      <1> 當前位置的格林尼治時間,格式為hhmmss
      <2> 狀態, A 為有效位置, V為非有效接收警告,即當前天線視野上方的衛星個數少于3顆。
      <3> 緯度, 格式為ddmm.mmmm
      <4> 標明南北半球, N 為北半球、S為南半球
      <5> 徑度,格式為dddmm.mmmm
      <6> 標明東西半球,E為東半球、W為西半球
      <7> 地面上的速度,范圍為0.0999.9
      <8> 方位角,范圍為000.0 359.9
      <9> 日期, 格式為ddmmyy
      <10> 地磁變化,從000.0 180.0
      <11> 地磁變化方向,為E W
      至于其他幾種幀格式,除了特殊用途外,平時并不常用,雖然接收機也在源源不斷地向主機發送各種數據幀,但在處理時一般先通過對幀頭的判斷而只對"$GPRMC"幀進行數據的提取處理。如果情況特殊,需要從其他幀獲取數據,處理方法與之也是完全類似的。由于幀內各數據段由逗號分割,因此在處理緩存數據時一般是通過搜尋ASCII"$"來判斷是否是幀頭,在對幀頭的類別進行識別后再通過對所經歷逗號個數的計數來判斷出當前正在處理的是哪一種定位導航參數,并作出相應的處理。下面就是對緩存Data中的數據進行解幀處理的主要代碼,本文在此只關心時間(日期和時間)和地理坐標(經、緯度):
    for(int i=0;iBR>  if(Data=='$') file://
    幀頭,SectionID為逗號計數器
      SectionID=0;
      if(Data==10){ file://幀尾
    }
     if(Data==',') file://逗號計數
      SectionID++;
     else {
      switch(SectionID){
       case 1: file://提取出時間
        m_sTime+=Data;
        break;
       case 2: file://判斷數據是否可信(GPS天線能接收到有3GPS衛星時為A,可信)
        if(Data=='A')
         GPSParam[m_nNumber].m_bValid=true;
         break;
       case 3: file://提取出緯度
         m_sPositionY+=Data;
         break;
       case 5: file://提取出經度
         m_sPositionX+=Data;
         break;
       case 9: file://提取出日期
         m_sDate+=Data;
         break;
         default:
         break;
      }
     }
    }
      現在已將所需信息提取到內存,即時間、日期以及經緯度分別保存在CString型變量 m_sTimem_Datam_sPositionYm_sPositionX中。在實際應用中往往要根據需要對其做進一步的運算處理,比如從GPS接收機中獲得的時間信息為格林尼治時間,因此需要在獲取時間上加8小時才為我國標準時間。而且GPS使用的WGS84坐標系也與我國采用的坐標系不同,有時也要對此加以變換。而這些變換運算必須通過數值運算完成,因此需要將前面獲取的字符型變量轉化為數值型變量,這部分工作可放在檢測到幀尾完成:
    ::strcpy(buf,m_sTime); 
    str.Format("%c%c",buf[0],buf[1]);
    GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24; file://
    提取出小時并轉化為24小時制北京時間
    23字節為分鐘,45字節為秒,提取方法同上
    ……
    ::strcpy(buf,m_sDate);
    str.Format("%c%c",buf[0],buf[1]); file://
    提取出月份
    23字節為天,45字節為年,提取方法同上
    ……
    ::strcpy(buf,m_sPositionY);
    str.Format("%c%c",buf[0],buf[1]);
    PositionValue=atoi(str); 
    str.Format("%c%c%c%c%c%c%c",buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8]);
    GPSParam[m_nNumber].m_dPositionY=PositionValue*60+atof(str); file://
    提取出緯度
    ……
    ::strcpy(buf,m_sPositionX);
    if(m_sPositionX.GetLength()==10) file://
    經度超過90(如東經125)
    {
     str.Format("%c%c%c",buf[0],buf[1],buf[2]);
     PositionValue=atoi(str);
     str.Format("%c%c%c%c%c%c%c",buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
     GPSParam[m_nNumber].m_dPositionX=PositionValue*60+atof(str); file://提取出經度(單位為分)
    }
    if(m_sPositionX.GetLength()==9) file://
    經度未超過90(如東經89)
    {
     file://處理方法同上,只是buf的第01字節為度數,2~9為分數。
    }

      到此為止,已將時間和經緯度信息提取到GPS結構數組GPSParam中的各個變量中去,后續的處理和高層決策可根據該結構中存儲的數據作出相應的處理。
      小結
      本文結合主要的相關程序代碼對GPS全球定位系統的定位導航信息的接收和參數數據的提取進行了討論,同時也對串口的程序設計作了簡要的講述。通過本文的設計方法可以將GPS定位導航信息從GPS接收機完整接收,通過對定位參數的提取可將其應用于其他高層應用決策如各種GISRS系統等。本文程序在Windows 98下,由Microsoft Visual C++ 6.0編譯通過。

      聲明①:文章部分內容來源互聯網,如有侵權請聯系刪除,郵箱 cehui8@qq.com

      聲明②:中測網登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點或證實其描述,文章內容僅供參考。

      加群提示:我們創建了全國32個省份的地方測繪群,旨在打造本地測繪同行交流圈,有需要請聯系管理員測小量(微信 cexiaoliang)進群,一人最多只能進入一個省份群,中介人員勿擾

    主站蜘蛛池模板: 特级毛片 | 日韩精品免费一区二区在线观看 | 成人av在线网 | 凹凸日日摸日日碰夜夜 | 久久久久久久久国产 | 午夜视频免费 | 在线中文| 四虎最新网站 | 精品久久久久久久久久久 | 久草在线 | 日韩欧美视频一区二区三区 | 亚洲蜜臀av乱码久久精品蜜桃 | 天天干天天操天天爽 | 成人毛片在线视频 | 久久久123| 在线观看91 | 亚洲成人免费观看 | 欧美不卡视频 | 久草电影网 | 日本在线www| 欧美精品区 | 天天狠天天操 | 91久久精品一区二区二区 | 国产精品一区二区在线看 | 精品中文字幕一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 成人毛片在线免费看 | 国产一区免费在线观看 | 久久久网 | 污网址在线免费观看 | 日韩在线欧美 | 久久久一区二区三区 | 国产精品久久久久久久久久妞妞 | 蜜臀91精品国产高清在线观看 | 欧美一二三区在线观看 | 天堂va久久久噜噜噜久久va | 精品国产区 | 欧美2区 | 亚洲精品久久久久久久久久久久久 | 精品免费视频一区二区 | 精品一区二区三区蜜桃 |