有人云:'GPS的應用,僅受人們的想象力制約。'GPS問世以來,已充分顯示了其在導航定位領域的霸主地位。許多領域也由于GPS的出現而產生革命性變化。目前,幾乎全世界所有需要導航定位的用戶,都被GPS的高精度、全天候、全球覆蓋、方便靈活和優質價廉所吸引。在嵌入式產品的開發應用中,很多領域都涉及到GPS導航和定位的應用;英創的很多用戶,就是在英創的嵌入式主板的基礎上,外接GPS應用模塊,來實現GPS在各種領域的合理運用。英創隨之也向用戶提供了相關GPS的方案和例程,供用戶在實際應用中進行參考。本文介紹了英創C# GPS例程通過串口讀取GPS模塊定位數據的方法。
GPS模塊只要處于工作狀態就會源源不斷地把接收并計算出的GPS導航定位信息傳送到連接到它的嵌入式主板串口之上,在沒有進一步處理之前,傳送的數據是一長串字節流信息。因此必須經過程序將其轉化為有實際意義的;可供高層決策使用的定位信息數據。與其他通信協議類似,GPS模塊都遵循NMEA-0183協議,GPS進行信息提取,必須明確其幀結構,然后才能根據其結構完成對各個定位信息的提取;其發送到串口的數據主要由幀頭,幀尾和幀內數據組成。根據數據幀的不同,幀頭也不相同,主要有“#GPGGA”,“$GPGSA”,“$GPRMC”等。這些幀頭標識了后續幀內數據的組成結構,各幀均以回車符和換行符作為幀尾標識一幀的結束。對于通常的情況,大家所關心的定位數據如經緯度、速度、時間、航向等均以“$GPRMC”中獲取得到。該幀的結構及各字段釋義如下:
例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50
字段0:$GPRMC,語句ID,表明該語句為Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦最小定位信息
字段1:UTC時間,hhmmss.sss格式
字段2:狀態,A=定位,V=未定位
字段3:緯度ddmm.mmmm,度分格式(前導位數不足則補0)
字段4:緯度N(北緯)或S(南緯)
字段5:經度dddmm.mmmm,度分格式(前導位數不足則補0)
字段6:經度E(東經)或W(西經)
字段7:速度,節,Knots
字段8:方位角,度
字段9:UTC日期,DDMMYY格式
字段10:磁偏角,(000 - 180)度(前導位數不足則補0)
字段11:磁偏角方向,E=東W=西
字段16:校驗值
對于用戶的應用程序來講,要讀取GPS模塊的定位數據,無非是實現兩個簡單的步驟:(1)讀取串口數據;(2)將讀取的數據解析出來。
我們以預裝了WinCE嵌入式操作系統的ARM9主板EM9161來連接GPS模塊,用C#來實現讀取GPS模塊發過來的串口數據,最方便的方法是直接使用VS2005提供的SerialPort串口類,這個串口類提供一個DataRecieved事件響應機制,可以簡單方便地讀取串口數據,如:
private SerialPort myserialPort = new SerialPort(); // 定義SerialPort串口類對象myserialPort
……
myserialPort.DataReceived += new SerialDataReceivedEventHandler(myserialPort_DataReceived);
// 當串口有數據收到時,啟動myserialPort_DataRecieved事件函數
收到的串口數據是標準的string字符串,以“$GPRMC”開頭的幀為例,收到的每一幀數據string都以回車換行符為結尾,可以以回車換行符為標志將數據string提取出來;而且這個數據幀的每個元素均以逗號分隔,可以通過逗號分隔將這個數據幀的每個元素提取到一個string數組里面進行進一步處理。如:
string GPS_text = ''; // 字符串GPS_text = 接收到的串口數據,缺省定義為空
// 串口有數據收到
private void myserialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
GPS_text = GPS_text + myserialPort.ReadExisting(); // 讀取串口數據
if (GPS_text.EndsWith('\n')) // 如果GPS_text字符串最后一個字符是“回車”
{
Invoke(new EventHandler(update_data)); // 通過Invoke方法執行update_data函數
}
}
private void update_data(object sender, EventArgs e)
{
string[] GPS_info = GPS_text.Split(','); // 按照逗號分隔把$GPRMC各種信號分割到字符串數組
…… // 處理GPS_info字符串數組,完成GPS數據顯示、處理等功能
GPS_text = ''; // 置空GPS_text以便存儲新的串口接收到的字符串
}
英創提供的例程運行界面如下:
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35227
發布評論請先 登錄
相關推薦
評論