2012-03-21 5 views
0

のためのオフラインパーサーGPSを私のプロジェクトに追加したい:私が運転している間に私が収集した情報を設定するためにGPS文章を記録したいおよびタイミング情報)を何らかの種類のデータ構造に格納する。GPS文章をWindows/Linuxのplaform-free Cコード

誰でも無料のCコードをWindows/Linux上でオンラインで入手できますか?

答えて

1

ほとんどのGPS受信機はNMEAプロトコルを使用して位置情報を出力しますが、Cで書かれたNMEAパーサが必要です。例としてNMEA Libraryを見てください。

ライブラリには多数のサンプルアプリケーションが含まれています。おそらく最も理解しやすく/実装するのがnmealib\samples\parseディレクトリにあります。

#include <nmea/nmea.h> 
#include <string.h> 

int main() 
{ 
    const char *buff[] = { 
     "$GPRMC,173843,A,3349.896,N,11808.521,W,000.0,360.0,230108,013.4,E*69\r\n", 
     "$GPGGA,111609.14,5001.27,N,3613.06,E,3,08,0.0,10.2,M,0.0,M,0.0,0000*70\r\n", 
     "$GPGSV,2,1,08,01,05,005,80,02,05,050,80,03,05,095,80,04,05,140,80*7f\r\n", 
     "$GPGSV,2,2,08,05,05,185,80,06,05,230,80,07,05,275,80,08,05,320,80*71\r\n", 
     "$GPGSA,A,3,01,02,03,04,05,06,07,08,00,00,00,00,0.0,0.0,0.0*3a\r\n", 
     "$GPRMC,111609.14,A,5001.27,N,3613.06,E,11.2,0.0,261206,0.0,E*50\r\n", 
     "$GPVTG,217.5,T,208.8,M,000.00,N,000.01,K*4C\r\n" 
    }; 

    int it; 
    nmeaINFO info; 
    nmeaPARSER parser; 

    nmea_zero_INFO(&info); 
    nmea_parser_init(&parser); 

    for(it = 0; it < 6; ++it) 
     nmea_parse(&parser, buff[it], (int)strlen(buff[it]), &info); 

    nmea_parser_destroy(&parser); 

    return 0; 
} 

代わり先ほどパーサーに受信機から受信されたNMEAストリングを渡す必要がパーサーに(buffに)固定された文字列を渡すので、GPS受信機を実現することができます。収集されたデータは、info構造で利用可能になります。

独自のパーサーを開発する場合は、hereを見て、GPS受信機から出力されるさまざまなメッセージの詳細を調べてください。ほとんどのGPS受信機は、RMC、GGA、GSA、GSV、GLL、VTG、および(まれに)ZDAのみを出力します。

+0

感謝timrorr、それはよさそうだが、このライブラリを使用する方法に関するドキュメントはありません。誰もがこのコードに精通しており、どのように使用するのか説明できますか?ありがとうございました – user1106106

+0

ライブラリをどのように使用するかを説明する答えを広げました。 – timrorr

0

Linuxでは、Cライブラリlibnmeaを使用して、NMEA文を解析できます。欠落しているものが見つかった場合は、本当に使いやすく、新しい文章タイプを実装するのも簡単です。

libnmea at GitHub

クローンプロジェクト:

$ git clone https://github.com/jacketizer/libnmea.git 
$ cd libnmea 

それを構築:

$ make && sudo make install && make unit-tests 

例コード(main.cの):

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#include <nmea.h> 
#include <nmea/gpgga.h> 

int 
main(void) 
{ 
    // Sentence string to be parsed 
    char *sentence = strdup("$GPGLL,4916.45,N,12311.12,W,225444,A\n\n"); 

    printf("Parsing NMEA sentence: %s", sentence); 

    // Pointer to struct containing the parsed data. Should be freed manually. 
    nmea_s *data; 

    // Parse... 
    data = nmea_parse(sentence, strlen(sentence), 0); 

    if (NMEA_GPGGA == data->type) { 
      nmea_gpgga_s *gpgga = (nmea_gpgga_s *) data; 

      printf("GPGGA Sentence\n"); 
      printf("Number of satellites: %d\n", gpgga->n_satellites); 
      printf("Altitude: %d %c\n", gpgga->altitude, gpgga->altitude_unit); 
    } 

    nmea_free(data); 
    free(sentence); 

    return 0; 
} 
を-lnmeaと

コンパイル:

$ gcc main.c -lnmea -o main