2019亚洲日韩新视频_97精品在线观看_国产成人精品一区二区_91精品网站在线观看

使用c++提取GPS全球定位系統定位數據

來源:期刊VIP網所屬分類:軟件開發時間:瀏覽:

  摘 要:本文主要針對GPS導航定位系統,對其衛星定位信息的接收及其定位參數提取的實現方法予以介紹,并使用C++可視化編程技術得以實現。

  關鍵字:c++;GPS全球定位系統定位;GPS數據提取

  Abstract: This paper is focused on GPS navigation and positioning system, introduced the receiving and positioning parameters of the satellite positioning information extraction method, and use C + + programming techniques of visualization can be achieved.

  Key words: C + +; the positioning of the GPS global positioning system; GPS data extraction

  中圖分類號:P28 文獻標識碼:A 文章編號:2095-2104(2012)

  1.引言

  近年來,衛星導航技術飛速發展,已逐漸取代了傳統導航技術,逐漸成為一種普遍采用的導航定位技術,并在測量精度、實時性、全天候等方面取得了長足進步。經常性應用于物理勘探、電離層測量和航天器導航等諸多民用領域,在軍事領域也取得了廣泛的應用,在導彈發射、野戰指揮系統、彈道測量以及軍用電子地圖快速測繪等領域均采用了衛星導航定位技術。由于衛星導航技術在民用和軍事領域的重要意義,使其得到了許多國家的關注。我國現在也正在建立自己的衛星導航定位系統"北斗導航系統",已經在汶川地震中得到使用。目前在我國應用最多的還是美國的GPS系統和俄羅斯的GLONASS體統。

  2.定位信息的接收

  GPS定位信息接收系統主要由GPS接收天線、變頻器、信號通道、微處理器、存儲器以及電源等部分組成。由于GPS定位信息內容不多,數據量不大,因此多用RS-232串口將定位信息(NEMA0183語句)從GPS接收機傳送到計算機中進行信息提取處理。從串口讀取數據有多種方法,我在此直接使用Win32API函數對其進行編程處理。在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);

  }

  3.定位數據的提取

  GPS接收機只要處于工作狀態就會持續地把接收并計算出的GPS導航定位信息通過串口傳送到計算機中。前面所寫的代碼只負責從串口接收數據并將其放置于緩存中,在沒有進一步處理之前緩存中是一長串字節流,這些信息在沒有經過分類提取之前是無法利用的。因此,必須寫程序將各個字段的信息從緩存字節流中提取出來,將其轉化成有實際意義的、可供決策使用的定位信息數據。這同通訊協議類似,對GPS進行信息提取必須首先明確其幀結構,然后才能根據其結構完成對各定位信息的提取。對于本文所使用的GARMINGPS天線板,其發送到計算機的數據主要由幀頭、幀尾和幀內數據組成,根據數據幀的不同,幀頭也不相同,主要有"$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.0到999.9

  <8>方位角,范圍為000.0到359.9度

  <9>日期,格式為ddmmyy

  <10>地磁變化,從000.0到180.0度

  <11>地磁變化方向,為E或W

  至于其他幾種幀格式,除了特殊用途外,平時并不常用,雖然接收機也在不斷地向主機發送各種數據幀,但在處理時一般先通過對幀頭的判斷而只對"$GPRMC"幀進行數據的提取處理。如果情況特殊,則需要從其他幀獲取數據,處理方法與之也是完全類似的。由于幀內各數據段由逗號分割,因此在處理緩存數據時一般是通過搜尋ASCII碼"$"來判斷是否是幀頭,在對幀頭的類別進行識別后再通過對所經歷逗號個數的計數來判斷出當前正在處理的是哪一種定位導航參數,并作出相應的處理。下面就是對緩存Data中的數據進行解幀處理的主要代碼,本文在此只關心時間(日期和時間)和地理坐標(經、緯度):for(inti=0;iBR>if(Data[i]=='$')file://幀頭,SectionID為逗號計

  數器SectionID=0;

  if(Data[i]==10){file://幀尾

  }

  if(Data[i]==',')file://逗號計數

  SectionID++;

  else{

  switch(SectionID){

  case1:file://提取出時間

  m_sTime+=Data[i];

  break;

  case2:file://判斷數據是否可信(當GPS天線能接收到有3

  顆GPS衛星時為A,可信)

  if(Data[i]=='A')

  GPSParam[m_nNumber].m_bValid=true;

  break;

  case3:file://提取出緯度

  m_sPositionY+=Data[i];

  break;

  case5:file://提取出經度

  m_sPositionX+=Data[i];

  break;

  case9:file://提取出日期

  m_sDate+=Data[i];

  break;

  default:

  break;}}}}

  現在已將所需信息提取到內存,即時間、日期以及經緯度分別保存在CString型變量m_sTime、m_Data、m_sPositionY和m_sPositionX中。在實際應用中往往要根據需要對其做進一步的運算處理,比如從GPS接收機中獲得的時間信息為格林尼治時間,因此需要在獲取時間上加8小時才轉變為我國北京標準時間。而且GPS使用的WGS-84坐標系也與我國采用的坐標系不同,有時也要對此加以變換。而這些變換運算必須通過數值運算完成,因此需要將前面獲取的字符型變量轉化為數值型變量,這部分工作可放在檢測到幀尾完成:

  ::strcpy(buf,m_sTime);

  str.Format("%c%c",buf[0],buf[1]);

  GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24;file://提取出小

  時并轉化為24小時制北京時間

  file://buf第2、3字節為分鐘,4、5字節為秒,提取方法同上

  ??

  ::strcpy(buf,m_sDate);

  str.Format("%c%c",buf[0],buf[1]);file://提取出月份

  file://buf第2、3字節為天,4、5字節為年,提取方法同上

  ??

  ::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的第0、1字節為度數,2~9為分

  數。

  }

  至此,我們已將時間和經緯度信息提取到GPS結構數組GPSParam中的各個變量中去,后續的處理和高層決策可根據該結構中存儲的數據作出相應的判斷處理。

  4.小結

  本文對GPS全球定位系統的定位導航信息的接收和參數數據的提取進行了討論并結合主要的在VC++相關程序代碼進行提取實現,同時也對基于串口的VC++程序設計作了簡要的介紹。通過本文的設計方法可以將GPS定位導航信息從GPS接收機完整接收,通過對定位參數的提取,可將其應用于各種GIS、RS系統等。本文程序在WindowsXP下,由MicrosoftVisualC++6.0編譯通過。

  參考文獻:

  [1] Chansarkar,M. and L. J. Garin (2000). Acquisition of GPS Signals at Very Low Signal to Noise Ratio [J]. In Proceedings of the Institute of Navigation ION National Technical Meeting-2000 (January 26-28,2000, Anaheim, California), pages 731-737.

  [2] Kuusniemi, H., and G. Lachapelle. GNSS Signal Reliability Testing in Urban and Indoor Environments [J]. Proceedings of NTM 2004(San Diego, January 24-28), 210-224.

  [3] 王曉明, 殷耀國, 楊自明. 全球導航衛星系統的現代化進展[J]. 全球定位系統, 2006, 31(4): 39- 42.

  [4] 曾慶化, 劉建業, 彭文明等. 我國衛星導航系統相關技術發展分析[J]. 航天控制, 2006, 24 ( 4) : 91- 96.

主站蜘蛛池模板: 清流县| 田阳县| 张掖市| 葫芦岛市| 宜丰县| 东乡族自治县| 类乌齐县| 万安县| 江西省| 大同县| 台北县| 武山县| 大安市| 北安市| 内江市| 桓仁| 阿尔山市| 阜阳市| 英德市| 南开区| 外汇| 普洱| 平阴县| 繁峙县| 叶城县| 蓬莱市| 方山县| 巴中市| 临朐县| 南汇区| 贵州省| 东明县| 达日县| 巨鹿县| 曲沃县| 静海县| 长岛县| 仁寿县| 临泉县| 蓬溪县| 定远县|