天天看點

GPS-NMEA0183格式(wletv整理)

        NMEA協定是為了在不同的GPS導航裝置中建立統一的RTCM(海事無線電技術委員會)标準,它最初是由美國國家海洋電子協會(NMEA—The NationalMarine Electronics Association)制定的。NMEA協定有0180、0182和0183這3種,0183可以認為是前兩種的更新,也是目前使用最為廣泛的一種。在實際使用中,如果隻是接收GPS的輸出.則隻需兩根信号線 GPS資料輸出線和信号地線,可以直接将EIA-422輸出通道兩條信号線的中一條同計算機的Rs232C輸入線相連。

        GPS(全球定位系統)接收機與手持機之間的資料交換格式一般都由生産廠商預設定制,其定義内容普通使用者很難知曉,且不同品牌、不同型号的GPS接收機所配置的控制應用程式也因生産廠家的不同而不同。是以,對于通用GPS應用軟體,需要一個統一格式的資料标準,以解決與任意一台GPS的接口問題。NMEA-0183資料标準就是解決這類問題的方案之一。NMEA協定是為了在不同的GPS導航裝置中建立統一的RTCM(海事無線電技術委員會)标準,它最初是由美國國家海洋電子協會(NMEA—The NationalMarine Electronics Association)制定的。NMEA協定有0180、0182和0183這3種,0183可以認為是前兩種的更新,也是目前使用最為廣泛的一種

NMEA通訊協定硬體接口

符合NMEAO183标準的GPS接收機的硬體接口能夠相容計算機的RS-232C協定序列槽,然而,嚴格來說NMEA标準不是RS-232C,規範推薦依照EIA422(也稱為RS-422)。是一個與RS-232C不同的系統。标準RS-232C采用負邏輯,即邏輯“1”表示-5V~ -15v,邏輯“0”表示+5V~+15V,利用傳輸信号線和信号地之間的電壓差進行傳輸。而EIA-422是利用導線之間的信号電壓差來傳輸信号的,其每個通道要用兩條信号線,一條是邏輯“1”,~條是邏輯“0”,通過傳輸線驅動器和傳輸線接收器實作邏輯電平和電位差之間的轉換,一般允許驅動器輸出為±2V~ ±6V 。

雖然存在差別,但在實際使用中,如果隻是接收GPS的輸出.則隻需兩根信号線 GPS資料輸出線和信号地線,可以直接将EIA-422輸出通道兩條信号線的中一條同計算機的Rs232C輸入線相連(這個方法我并沒有試驗過,是從别的地方聽來的,有興趣有條件的兄弟可以動手實驗一下,不過後果自負哦!呵呵)。

NMEA通訊協定所定義的标準通訊接口參數為:

波特率:4800bit/s;

資料位:8位;

停止位:1位;

奇偶校驗:無;

NMEA-OI83語句解析

NMEA通訊協定所規定的通訊語句都已是以ASCII碼為基礎的,NMEA-0183協定語句的資料格式如下:“$”為語句起始标志;“,”為域分隔符;“ *”為校驗和識别符,其後面的兩位數為校驗和,代表了“$”和“*”之間所有字元的按位異或值(不包括這兩個字元);“/”為終止符,所有的語句必須以來結束,也就是ASCII 字元的“回車”(十六進制的0D)和“換行”(十六進制的0A)。

典型的NMEA0183語句如下面的GPGGA語句。

當GPS正常工作時,語句如:

$GPGGA,053152,3957.7484,N,11626.7626,E,1,06,1.5,88.1,M,-8.0,M,,*64

當GPS收不到衛星信号時,GPGGA語句輸出變為:

$GPGGA,053247,3957.7484,N,11626.7626,E,0,00,,,M,,M,,*46

除标準語句外,NMEAO183規範還允許個别廠商定義私有的語句格式,這些語句以“$P”開始,然後是三個字元長度的廠商識别号,跟着是廠商定義的資料,接下來的資料格式與标準格式相同。

如Garmin的PGRME私有格式如下:

$PGRME,8.9,M,6.1,M,10.8,M*11

其中,“P”代表私有格式,“GRM”是Garmin的代碼,“E”表示語句類型。

NMEA資料進行中的注意事項

如果開發基于GPS的應用系統,就需要将GPS作為資訊源,正确接收和解析GPS發送的NMEA一0183資料。此時,在程式設計實作時需要注意幾個問題。

1、通訊端口的設定

雖然NMEA規範推薦的串行通訊參數為“波特率:4800;奇偶校驗:無;資料位:8;停止位:1”,但也有廠商的産品允許使用者将波特率設定的更高,此時需要注意設定計算機的接口參數與GPS裝置一緻。

2、 所需資訊的正确提取

NMEA—O183是以語句形式發送資料的,接收機可能發送很多類型的語句,而我們需要的可能隻是某些語句中的幾個字段。是以就需要對接收到的資料進行解析,取得所需的資訊。另外,可能會由于小數點位數不同等原因,語句的長度是可變的,因而分離感興趣的資訊時,不能按照該資訊在語句中所處的字元位置來查找,隻能依據逗号分隔符,這一點在資料提取的過程中非常重要。筆者就經常遇到一些應用軟體工程師,在提取NMEA語句中的資訊的時候按照字元的長度提取,這樣編出來的程式,通用性差,而且經常會出現資訊提取錯誤的問題。

以上都是我們在程式中需要注意的問題。為解決資訊的正确提取問題,并提高程式的複用性,可以編寫适當的函數,如一個函數用來分離語句(即通過$字元判斷語句頭,一直到換行回車結束一條語句);一個函數用來判斷語句中的字段數(通過“,”分隔符來提取語句字段),還有一個函數用來傳回語句中指定字段的内容。有了這三個函數,就可以友善的提取所需的資訊,此時的工作隻是簡單字元串比較和顯示格式的變換

檢驗和的計算與比較

最後,為了確定所采集的GPS資料的可靠性,必須進行檢驗和的計算與比較。檢驗和hh為“$”與“*”之間的所有字元按位異或的結果,并将其高4位和低4位各用一個十六進制數(字母大寫)表示出來。為此,需編寫函數,從語句頭識别符“*”開始,計算檢驗和,直至“*”到達為止,這時“*”号後面的兩個字元就是檢驗碼,将自己的計算結果同這兩個檢驗碼字元比較,若不同,按出錯處理,并繼續運作;若相同,則說明通訊成功,資料接收正确,可以處理該語句,提取所需資料。

Dos和windows采用 回車+換行CR/LF表示下一行,而UNIX/Linux采用換行符LF表示下一行,蘋果機(MAC OS系統)則采用回車符CR表示下一行. CR用符号’/r’表示, 十進制ASCII代碼是13, 十六進制代碼為0×0D;LF使用’/n’符号表示, ASCII代碼是10, 十六制為0×0A.是以Windows平台上換行在文本檔案中是使用 0d 0a 兩個位元組表示, 而UNIX和蘋果平台上換行則是使用0a或0d一個位元組表示

說 明:NMEA0183格式以“$”開始,主要語句有GPGGA,GPVTG,GPRMC等

1、 GPS DOP and Active Satellites(GSA)目前衛星資訊

$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF>

<1>模式 :M = 手動, A = 自動。

<2>定位型式 1 = 未定位, 2 = 二維定位, 3 = 三維定位。

<3>PRN 數字:01 至 32 表天空使用中的衛星編号,最多可接收12顆衛星資訊。

<4> PDOP位置精度因子(0.5~99.9)

<5> HDOP水準精度因子(0.5~99.9)

<6> VDOP垂直精度因子(0.5~99.9)

<7> Checksum.(檢查位).

2、 GPS Satellites in View(GSV)可見衛星資訊

$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF>

<1> GSV語句的總數

<2> 本句GSV的編号

<3> 可見衛星的總數,00 至 12。

<4> 衛星編号, 01 至 32。

<5>衛星仰角, 00 至 90 度。

<6>衛星方位角, 000 至 359 度。實際值。

<7>訊号噪聲比(C/No), 00 至 99 dB;無表未接收到訊号。

<8>Checksum.(檢查位).

第<4>,<5>,<6>,<7>項個别衛星會重複出現,每行最多有四顆衛星。其餘衛星資訊會于次一行出現,若未使用,這些字段會空白。

3、Global Positioning System Fix Data(GGA)GPS定位資訊

$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>

<1> UTC時間,hhmmss(時分秒)格式

<2> 緯度ddmm.mmmm(度分)格式(前面的0也将被傳輸)

<3> 緯度半球N(北半球)或S(南半球)

<4> 經度dddmm.mmmm(度分)格式(前面的0也将被傳輸)

<5> 經度半球E(東經)或W(西經)

<6> GPS狀态:0=未定位,1=非差分定位,2=差分定位,6=正在估算

<7> 正在使用解算位置的衛星數量(00~12)(前面的0也将被傳輸)

<8> HDOP水準精度因子(0.5~99.9)

<9> 海拔高度(-9999.9~99999.9)

<10> 地球橢球面相對大地水準面的高度

<11> 差分時間(從最近一次接收到差分信号開始的秒數,如果不是差分定位将為空)

<12> 差分站ID号0000~1023(前面的0也将被傳輸,如果不是差分定位将為空)

4、Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦定位資訊

$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>

<1> UTC時間,hhmmss(時分秒)格式

<2> 定位狀态,A=有效定位,V=無效定位

<3> 緯度ddmm.mmmm(度分)格式(前面的0也将被傳輸)

<4> 緯度半球N(北半球)或S(南半球)

<5> 經度dddmm.mmmm(度分)格式(前面的0也将被傳輸)

<6> 經度半球E(東經)或W(西經)

<7> 地面速率(000.0~999.9節,前面的0也将被傳輸)

<8> 地面航向(000.0~359.9度,以真北為參考基準,前面的0也将被傳輸)

<9> UTC日期,ddmmyy(日月年)格式

<10> 磁偏角(000.0~180.0度,前面的0也将被傳輸)

<11> 磁偏角方向,E(東)或W(西)

<12> 模式訓示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=資料無效)

5、 Track Made Good and Ground Speed(VTG)地面速度資訊

$GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh<CR><LF>

<1> 以真北為參考基準的地面航向(000~359度,前面的0也将被傳輸)

<2> 以磁北為參考基準的地面航向(000~359度,前面的0也将被傳輸)

<3> 地面速率(000.0~999.9節,前面的0也将被傳輸)

<4> 地面速率(0000.0~1851.8公裡/小時,前面的0也将被傳輸)

<5> 模式訓示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=資料無效)

http://www.unistrong.com/bbs/topic.aspx?topicid=1438

http://mcuos.com/thread-1753-1-1.html

繼續閱讀