VC 實現串列埠通訊下GP接收機定位資料的提取

2021-04-06 21:53:13 字數 3024 閱讀 7365

定位資訊的接收

通常gps定位資訊接收系統主要由gps接收天線、變頻器、訊號通道、微處理器、儲存器以及電源等部分組成。由於gps定位資訊內容較少,因此多用rs-232串列埠將定位資訊(nema0183語句)從gps接收機傳送到計算機中進行資訊提取處理。從串列埠讀取資料有多種方法,在此直接使用 win32 api函式對其進行程式設計處理。在windows下不允許直接對硬體埠進行控制操作,所有的埠均被視為"檔案",因此在對串列埠進行偵聽之前需要通過開啟檔案來開啟串列埠,並對其進行相關引數配置:

在成功開啟並設定通訊口後,可採取輪詢串列埠和事件觸發兩種方式對資料進行接收處理,本文在此採取效率比較高的事件觸發方式進行接收處理,通過等待ev_rxchar事件的發生來啟動readfile函式完成對gps定位資訊的接收:

while(true)

提取定位資料

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.0到999.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)

if(data==',') file://逗號計數

sectionid++;

else }}

現在已將所需資訊提取到記憶體,即時間、日期以及經緯度分別儲存在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,buf[7],buf);

gpsparam[m_nnumber].m_dpositiony=positionvalue*60+atof(str); file://提取出緯度

……::strcpy(buf,m_spositionx);

if(m_spositionx.getlength()==10) file://經度超過90度(如東經125度)

if(m_spositionx.getlength()==9) file://經度未超過90度(如東經89度)

到此為止,已將時間和經緯度資訊提取到gps結構陣列gpsparam中的各個變數中去,後續的處理和高層決策可根據該結構中儲存的資料作出相應的處理。

小結本文結合主要的相關程式**對gps全球定位系統的定位導航資訊的接收和引數資料的提取進行了討論,同時也對串列埠的程式設計作了簡要的講述。通過本文的設計方法可以將gps定位導航資訊從gps接收機完整接收,通過對定位引數的提取可將其應用於其他高層應用決策如各種gis、rs系統等。本文程式在windows 98下,由microsoft visual c++ 6.0編譯通過。

VC 串列埠通訊實現方式

利用師姐qt2440開發板控制機械臂,串列埠通訊出現問題,找到usb轉串列埠後,任然找不到相應的驅動。初步打算用微控制器實現。1.基於active控制元件的方式 mscomm 優點是 直接利用控制元件,在串列埠有資料到達時,會促發相應的事件響應函式,然後你可以在實踐響應函式裡,進行資料的讀取。缺點是...

VC串列埠通訊程式設計

win32串列埠程式設計 韓耀旭 在工業控制中,工控機 一般都基於windows平臺 經常需要與智慧儀表通過串列埠進行通訊。串列埠通訊方便易行,應用廣泛。一般情況下,工控機和各智慧儀表通過rs485匯流排進行通訊。rs485的通訊方式是半雙工的,只能由作為主節點的工控pc機依次輪詢網路上的各智慧控制...

非同步串列埠通訊 VC

mycomm.h 多機控制 非同步串列埠通訊 class cmycomm void cmycomm preopensetupqueue dword dwinqueue,dword dwoutqueue int byteusedtime 14400 nbaud 1 commtimeouts timeo...

VC 的串列埠通訊

在vc 中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex控制元件 microsoft communications control。另一種是直接用vc 訪問串列埠。下面將簡述這兩種方法。一 microsoft communications control micr...

VC 的串列埠通訊

在vc 中有兩種方法可以進行串列埠通訊。一種是利用microsoft公司提供的activex控制元件 microsoft communications control。另一種是直接用vc 訪問串列埠。下面將簡述這兩種方法。一 microsoft communications control micr...