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