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