プロジェクトにGPS機能を追加したい:運転中にGPSセンテンスを記録し、その後、収集した情報(主にコーディネーションとタイミング情報)をある種のデータ構造に設定したい。
誰かがそのためにWindows/Linuxでオンラインで利用できる無料のcコードを知っていますか?
ほとんどの GPS 受信機は、NMEA プロトコルを使用して位置情報を出力します。C で記述された NMEA パーサーが必要です。例としてNMEA ライブラリを見てください。
ライブラリには多数のサンプル アプリケーションが含まれており、おそらく最も簡単に理解/実装できるものは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;
}
GPS 受信機で実装する場合、固定文字列 ( buff) をパーサーに渡す代わりに、受信した NMEA 文字列を受信機からパーサーに渡すだけで済みます。収集されたデータは、info構造で使用できます。
独自のパーサーを開発したい場合は、GPS 受信機から出力される可能性のあるさまざまなメッセージの詳細な内訳について、ここを参照してください。ほとんどの GPS 受信機は、RMC、GGA、GSA、GSV、GLL、VTG、および (まれに) ZDA のみを出力します。
Linux では、C ライブラリlibnmeaを使用して NMEA 文を解析できます。不足している文が見つかった場合は、非常に使いやすく、新しい文の種類を簡単に実装できます。
プロジェクトを複製します。
$ 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