0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

nmealib的使用可以縮短GPS的開發(fā)周期

單片機愛好者 ? 2018-01-25 15:12 ? 次閱讀

程序員Tim 提供了一個非常完善的NMEA解碼庫,直接使用該解碼庫,可以避免重復(fù)發(fā)明輪子的工作。在野火提供的GPS模塊資料的“NMEA0183解碼庫源碼”文件夾中也包含了該解碼庫的源碼,野火提供的STM32程序就是使用該庫來解碼NMEA語句的。

該解碼庫目前最新為0.5.3版本,它使用純C語言編寫,支持windows、winCE 、UNIX平臺,支持解析GPGGA,GPGSA,GPGSV,GPRMC,GPVTG這五種語句(這五種語句已經(jīng)提供足夠多的GPS信息),解析得的GPS數(shù)據(jù)信息以結(jié)構(gòu)體存儲,附加了地理學(xué)相關(guān)功能,可支持導(dǎo)航等數(shù)據(jù)工作,除了解析NMEA語句,它還可以根據(jù)隨機數(shù)產(chǎn)生NMEA語句,方便模擬。

0.nmealib簡介

nmealib是一個基于C語言的用于nmea協(xié)議的開源庫。雖然nmea體積小巧,但是卻具備了不少功能。

分析NMEA語句并把結(jié)果保存在合適的C語言結(jié)構(gòu)體中。

除了解析NMEA語句之外,還可以產(chǎn)生NMEA語句。

支持多種NMEA語句,包括GPGGA, GPGSA, GPGSV, GPRMC, GPVTG。

解析算法層次嚴謹。

附加地理學(xué)相關(guān)功能,可支持導(dǎo)航等數(shù)據(jù)工作。

1.目錄介紹

nmealib的目錄還是非常清晰的,下面簡單介紹一下。

include\nmealib文件夾中存在nmealib相關(guān)的頭文件

src文件夾存放nmealib相關(guān)源文件,該文件夾中的內(nèi)容和include\nmealib文件夾相對應(yīng)

samples文件夾存放若干例子,一些簡單易懂的例子。

2.示例代碼

[cpp]view plaincopy

#include

#include

#include

intmain()

{

//被測試的GPS模塊輸出數(shù)據(jù),僅有GPRMC格式

chargps_str[]="$GPRMC,013257.00,A,3129.51829,N,12022.10562,E,0.093,,270813,,,A*7A\r\n";

nmeaINFOinfo;//nmea協(xié)議解析結(jié)果結(jié)構(gòu)體

nmeaPARSERparser;//nmea協(xié)議解析載體

nmea_zero_INFO(&info);//填入默認的解析結(jié)果

nmea_parser_init(&parser);//為解析載體分配內(nèi)存空間

//調(diào)用函數(shù)完成GPS信息解析,最終結(jié)果保留于info數(shù)組中

if((nmea_parse(&parser,gps_str,(int)strlen(gps_str),&info))>0)

{

printf("longitude%.5f\r\n",info.lon);

printf("latitude%.5f\r\n",info.lat);

printf("speed%.2f\r\n",info.speed);

}

nmea_parser_destroy(&parser);//釋放解析載體的內(nèi)存空間

return0;

}

nmealib的使用可以縮短GPS的開發(fā)周期

圖1 程序輸出結(jié)果

利用nmealib解析GPS模塊的輸出結(jié)果大致可以分為三步,第一步定義和初始化GPS信息結(jié)構(gòu)體和解析載體結(jié)構(gòu)體,第二步調(diào)用nmea_parse函數(shù)完成解析工作,第三步釋放解析載體所占用的內(nèi)存空間。如果仔細查看nmea_parser_init部分的代碼,便會發(fā)現(xiàn)函數(shù)中使用了C標準庫的malloc函數(shù),該函數(shù)會在RAM中的heap空間開辟一個空間,這就需要使用完該載體之后立刻釋放,所以nmea_parser_init和nmea_parser_destroy需要成對出現(xiàn)。

[cpp]view plaincopy

typedefstruct_nmeaINFO

{

intsmask;/**

nmeaTIMEutc;/**

intsig;/**

intfix;/**

doublePDOP;/**

doubleHDOP;/**

doubleVDOP;/**

doublelat;/**

doublelon;/**

doubleelv;/**

doublespeed;/**

doubledirection;/**

doubledeclination;/**

nmeaSATINFOsatinfo;/**

}nmeaINFO;

nmeaINFO是一個很關(guān)鍵的結(jié)構(gòu)體,該結(jié)構(gòu)體中保存了nmea語句解析的結(jié)果。例如lat代表緯度,lon代表精度,speed代表速度。需要注意的是lat和lon的數(shù)值格式和百度地圖的格式是有區(qū)別,而速度的單位為KM/H,相對于“節(jié)”這個單位,公里每小時要好理解的多。

GPS模塊可以輸出的內(nèi)容很多,但是最基本的信息可通過GPRMC獲得。GPRMC的具體格式如下內(nèi)容所示:

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

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

<2> 定位狀態(tài),A=有效定位,V=無效定位

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

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

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

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

<7> 地面速率(000.0~999.9節(jié),前面的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=數(shù)據(jù)無效)

在不同的情況下測試GPS模塊,可以獲得以下三種不同形式的輸出內(nèi)容:

1)$GPRMC,013257.00,A,3129.51829,N,12022.10562,E,0.093,,270813,,,A*7A\r\n

2)$GPRMC,022649.00,V,,,,,,,020913,,,N*7F\r\n

3)$GPRMC,,V,,,,,,,,,,N*53\r\n

【第一種】GPS定位成功,輸出正確的GPS位置信息和對地速度信息。

【第二種】GPS定位異常,只有UTC時間信息,其中V代表定位錯誤。

【第三種】GPS定位異常,甚至沒有UTC時間信息,其中V代表定位錯誤。

通過測試,nmealib處理第一種情況沒有任何問題,但是連續(xù)處理第二種和第三種情況會產(chǎn)生問題,產(chǎn)生問題的主要原因是動態(tài)開辟的空間沒有被釋放。解決該問題需要修改nmealib的源代碼。如果不想修改nmealib源代碼,可以在串口接收GPS輸出內(nèi)容時直接過濾帶有V的字符串,這種方法簡單有效,同樣可以獲得準確的GPS坐標信息。

3.若干注意點

3.1 重置解析載體緩沖區(qū)

由于nmealib雖然使用C語言,但是相關(guān)測試環(huán)境均基于PC環(huán)境,所以在嵌入式環(huán)境下需要對相關(guān)參數(shù)(宏定義)進行修改。例如context.h文件中,定義了待處理的nmea緩沖區(qū)的大小,相關(guān)宏定義如下

#define NMEA_DEF_PARSEBUFF (1024)

#define NMEA_MIN_PARSEBUFF (256)

示例代碼的分析中提到,解析載體parser通過動態(tài)內(nèi)存分配的方法開辟空間,該空間位于RAM空間中的heap部分,如果heap部分設(shè)置的太小,將會導(dǎo)致MCU進入不可預(yù)知的狀態(tài)或者直接掉入斷言中。

在編譯器設(shè)置中,option->linker,cstack和heap的大小設(shè)置如下圖所示,此時heap的大小僅有512個字節(jié),而解析載體卻需要1024個字節(jié),那么分配內(nèi)存時勢必會產(chǎn)生問題,而工程的編譯卻不會有任何問題。

圖2 不合適的HEAP大小設(shè)置

[cpp]view plaincopy

if(0==(parser->buffer=malloc(buff_size)))

nmea_error("Insufficientmemory!");//此時會發(fā)生內(nèi)存分配錯誤

else

{

parser->buff_size=buff_size;

resv=1;

}

在這種情況下可以適當減少緩沖區(qū)的大小,例如修改如下:

#define NMEA_DEF_PARSEBUFF (256)

#define NMEA_MIN_PARSEBUFF (128)

同時可以把HEAP空間大小的調(diào)整一下。

圖3 合適的HEAP大小設(shè)置

當然緩沖區(qū)的大小也是視情況而定,若GPS模塊僅輸出GPRMC語句,那么256字節(jié)的緩沖區(qū)已經(jīng)足夠了。但是如果GPS模塊輸出GPGGA, GPGSA, GPGSV, GPRMC, GPVTG等多種數(shù)據(jù),那么256字節(jié)的緩沖區(qū)也有可能不夠使用。

3.2 注意nmeaINFO結(jié)構(gòu)體大小

nmeaINFO結(jié)構(gòu)體左右360字節(jié),若該結(jié)構(gòu)體類型的變量勢必會占用較多的CSTACK(全局變量的情況除外),在嵌入式編程中像nmeaINFO類型的變量也可算的上是中型“人物”了。所以在調(diào)試的過程中可以打開IDE的stack查看功能(進入debug模式,view->stack),觀察當前函數(shù)的CSTACK使用情況,尤其要注意CSTACK越界的情況。

nmealib的使用可以縮短GPS的開發(fā)周期

圖4 查看CSTACK空間占用情況

從上圖可以看出,CSTACK的大小為2048字節(jié)(2K),此時被占用752字節(jié),占用率為36%,完全在可以接受的范圍內(nèi)。

4.總結(jié)

nmealib的使用可以縮短GPS的開發(fā)周期,這里只是簡單的舉例了nmealib的基本功能,更多的功能可以查看samples文件夾中的例子,并在實踐中不斷熟悉提高。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • gps
    gps
    +關(guān)注

    關(guān)注

    22

    文章

    2847

    瀏覽量

    165500
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134092

原文標題:GPS nmealib學(xué)習(xí)筆記

文章出處:【微信號:gh_dae0718828df,微信公眾號:gh_dae0718828df】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    縮短開發(fā)周期,充電倉SoC的多合一趨勢

    耳機充電倉既能為耳機增加續(xù)航,還起到了很好的收納作用。在TWS耳機百億級的市場規(guī)模驅(qū)使下,準入門檻較低、開發(fā)周期縮短的充電倉SoC迎來了需求的爆發(fā)。 ? 英集芯“多合一”TWS充電倉SoC ? 在電源管理、電池管理、無線信號處理
    的頭像 發(fā)表于 02-07 19:12 ?2410次閱讀

    PADS制造準備縮短周期時間

    PADS 制造準備可幫助您優(yōu)化產(chǎn)品質(zhì)量,縮短周期時間和節(jié)省成本。
    發(fā)表于 05-06 11:01

    關(guān)于GPS解析函數(shù)的問題

    GPS解析函數(shù)nmea_decode_test(void),使用NUCLEO-F411RE的串口6接收來自GPS的數(shù)據(jù),并通過DMA的方式將數(shù)據(jù)從串口6傳送到內(nèi)存,然后調(diào)用nmealib庫中的解析
    發(fā)表于 06-03 15:57

    GPS的相關(guān)資料下載

    進行顯示。這里分別介紹2中解析協(xié)議的方法,第一種就是自己寫解析協(xié)議函數(shù),第二種便是采用別人寫好的GPS解析協(xié)議庫:NMEALIB庫,將這個庫移植到M3中,直接調(diào)用API函數(shù),就可以解析出GPS
    發(fā)表于 02-08 07:37

    基于FPGA的GPS模塊和電子羅盤模塊驅(qū)動設(shè)計

    GPS和電子羅盤是定位系統(tǒng)的重要組成部分。在實際應(yīng)用中通常采用定制的GPS模塊和電子羅盤模塊,以簡化產(chǎn)品設(shè)計和縮短設(shè)計周期。但是采用DSP直接控制它們效率較低且費時,必將拖累
    發(fā)表于 10-25 16:54 ?203次下載
    基于FPGA的<b class='flag-5'>GPS</b>模塊和電子羅盤模塊驅(qū)動設(shè)計

    基于GPS軌跡的周期模式發(fā)現(xiàn)

    針對周期行為挖掘中面臨的時空數(shù)據(jù)采樣頻率不確定,數(shù)據(jù)稀疏,時空數(shù)據(jù)噪聲等問題,本文采用GMPF (GPS Multi-Periodic Find) 算法來檢測用戶的周期模式。該算法首先將用戶的軌跡
    發(fā)表于 01-04 15:02 ?0次下載

    如何快速在AWorks OS操作系統(tǒng)中開發(fā)并穩(wěn)定應(yīng)用GPS模塊

    物聯(lián)智能時代,GPS定位應(yīng)用愈發(fā)廣泛,如何快速應(yīng)用GPS定位模塊,穩(wěn)定有效的獲取定位信息,縮短項目周期是至關(guān)重要的。
    的頭像 發(fā)表于 07-10 08:59 ?3113次閱讀

    Vishay宣布將縮短MLCC供貨周期

    Vishay宣布,為了兌現(xiàn)公司支持多層陶瓷片式電容器(MLCC)客戶的承諾,宣布縮短MLCC供貨周期。
    發(fā)表于 07-15 15:37 ?917次閱讀

    物聯(lián)網(wǎng)參考設(shè)計開發(fā)人員如何縮短設(shè)計周期

    滿足對速度的需求Ignion的開發(fā)環(huán)境也有助于物聯(lián)網(wǎng)參考設(shè)計人員、開發(fā)人員和最終的制造商縮短其設(shè)計周期。借助于Ignion的技術(shù),從數(shù)千種潛在可用的、彼此不同的天線中找到合適選項的過程
    的頭像 發(fā)表于 11-01 10:14 ?2197次閱讀

    STM32:GPS解析

    進行顯示。這里分別介紹2中解析協(xié)議的方法,第一種就是自己寫解析協(xié)議函數(shù),第二種便是采用別人寫好的GPS解析協(xié)議庫:NMEALIB庫,將這個庫移植到M3中,直接調(diào)用API函數(shù),就可以解析出GPS
    發(fā)表于 12-04 20:36 ?40次下載
    STM32:<b class='flag-5'>GPS</b>解析

    2.4寸微波爐旋鈕屏極大縮短了用戶的產(chǎn)品開發(fā)周期

    編碼旋鈕方案,結(jié)構(gòu)緊湊、簡單,外觀精致;支持WIFI,用戶可以通過對擴展接口進行串口通訊、按鍵、usb攝像頭等功能的開發(fā)調(diào)試,極大縮短用戶產(chǎn)品開發(fā)
    發(fā)表于 01-14 15:12 ?963次閱讀
    2.4寸微波爐旋鈕屏極大<b class='flag-5'>縮短</b>了用戶的產(chǎn)品<b class='flag-5'>開發(fā)</b><b class='flag-5'>周期</b>

    ?高效開發(fā) | 開發(fā)周期可比同行業(yè)縮短60%,LuatOS公網(wǎng)對講機方案

    可以使用。公網(wǎng)對講機以其便利性以及覆蓋廣、成本低等特性,廣泛應(yīng)用于物流、物業(yè)、工地、酒店、學(xué)校及工廠等領(lǐng)域。合宙LuatOS公網(wǎng)對講機方案,開發(fā)周期可比同行業(yè)縮短
    的頭像 發(fā)表于 11-18 11:41 ?2063次閱讀
    ?高效<b class='flag-5'>開發(fā)</b> | <b class='flag-5'>開發(fā)</b><b class='flag-5'>周期</b>可比同行業(yè)<b class='flag-5'>縮短</b>60%,LuatOS公網(wǎng)對講機方案

    英偉達大幅縮短AI GPU交付周期

    根據(jù)瑞銀分析師最近提供給投資者的備忘錄,英偉達已經(jīng)顯著縮短了其AI GPU的交付周期。這一周期已經(jīng)從去年年底的8-11個月迅速縮短至目前的3-4個月。這一變化引發(fā)了市場的廣泛關(guān)注,分析
    的頭像 發(fā)表于 02-18 17:31 ?720次閱讀

    Arm宣布推出全新汽車技術(shù),可縮短多達兩年的人工智能汽車開發(fā)周期

    Arm 攜手生態(tài)伙伴推出了最新的 Arm 汽車增強 (AE) 處理器和虛擬平臺,讓汽車行業(yè)在開發(fā)伊始便可應(yīng)用,助力縮短多達兩年的開發(fā)周期。
    的頭像 發(fā)表于 03-14 12:17 ?798次閱讀

    Arm推出汽車增強處理器及虛擬平臺,縮短人工智能汽車開發(fā)周期

    近日,全球領(lǐng)先的半導(dǎo)體和基礎(chǔ)設(shè)施軟件設(shè)計公司Arm控股有限公司(納斯達克股票代碼:ARM,簡稱“Arm”)與合作伙伴共同推出了最新的Arm汽車增強(AE)處理器和虛擬平臺。這一創(chuàng)新解決方案旨在讓汽車行業(yè)在開發(fā)初期即可應(yīng)用,有望大幅縮短多達兩年的
    的頭像 發(fā)表于 03-28 10:46 ?451次閱讀