GPS項目實戰系列之:再談一次GPS數據解析

之前兩篇已經寫過GPS芯片解析的話題,今天之所以又寫一次,是因為又有了一些的新的內容想和大家分享。

第一個要分享的是,來源於一位網友的留言,

GPS項目實戰系列之:再談一次GPS數據解析

在上一篇文章裡,我採用的是用strtok函數進行字段分割,該網友建議試試sscanf,sscanf函數不知道大家平時有沒有用過,它用來分割並處理一串數據比較方便。看個小例子,

<code>#include <math.h>

#include <stdio.h>

#include <stdlib.h>


char *tokenstring = "first,25.5,second,15";

int result, i;

double fp;

char o[10], f[10], s[10], t[10];


void main()

{

result = sscanf(tokenstring, "%[^','],%[^','],%[^','],%s", o, s, t, f);

fp = atof(s);

i = atoi(f);

printf("%s %lf %s %d", o, fp, t, i);

}/<stdlib.h>/<stdio.h>/<math.h>/<code>

運行結果如下:

GPS項目實戰系列之:再談一次GPS數據解析

所以用這個sscanf來解析NMEA語句也是可以的,類似上述例子的處理方式就可以,有一點和使用strtok函數一樣,要注意處理連續逗號的情況,也可以採用先將連續逗號之間插入特殊字符再解析的辦法。

咱們再來看一個sscanf函數的使用例子,

<code>/* sscanf example */

#include <stdio.h>


int main ()

{

char sentence []="Rudolph is 12 years old";

char str [20];

int i;


sscanf (sentence,"%s %*s %d",str,&i);

printf ("%s -> %d",str,i);


return 0;

}/<stdio.h>/<code>

運行結果如下:

GPS項目實戰系列之:再談一次GPS數據解析

通過這個例子,可以看到sscanf函數用起來其實是很靈活的,參數中的星號*表示數據是從流 stream 中讀取的,但是可以被忽視,即它不存儲在對應的參數中。關於sscanf函數詳細用法,可參考:http://www.cplusplus.com/reference/cstdio/scanf/

它的第二個參數和scanf函數第二個參數用法一樣。

第二個要分享的是,有一個網友建議去了解一下nmealib,官方介紹在:http://nmea.sourceforge.net/ ,源碼下載地址在:https://sourceforge.net/projects/nmea/files/latest/download

我之前聽說過有GPS相關的開源代碼,正好就藉機去學習了下,這個庫用起來挺簡單的,我花了點時間將它應用到了ARM Linux下。

使用過程中有幾點需要注意的是:

1) 本身這個庫對於GGA、RMC語句,只支持GP開頭的,即GPGGA、GPRMC,無法處理GNGGA、GNRMC語句,我採用的方法是將讀取到的GN開頭的語句替換為GP開頭,沒有修改庫本身的源代碼,另外需要注意的是要重新生成一個校驗值更新過去,否則校驗不通過。

2) 傳入解析函數nmea_parse的數組必須是\\r\\n結尾,否則也無法正常解析。

3) 解析得到的經緯度格式是度分格式,如果需要使用其他格式,自己得再換算一次。

第三個要分享的是,還有一個網友建議去了解minmea,該源碼在:https://github.com/kosma/minmea

GitHub上介紹: a lightweight GPS NMEA 0183 parser library in pure C。

它是一個輕量級的庫,並且該網友反饋他在單片機實際項目中用的就是這個。

感興趣的童靴可以自己去研究研究。

我在它的README文件裡看到一句話:Good documentation on NMEA is at https://gpsd.gitlab.io/gpsd/NMEA.html ,提到了一個NEMA比較好的網址,這個網址比絕大多數東抄西抄的中文網址內容要好的多。

我們在平時工作寫代碼的時候,可以多利用一些開源的代碼,它會加速我們的進度,同時開源代碼中的編程思想、代碼實現細節也值得我們學習和參考。


分享到:


相關文章: