Автономный парсер предложений GPS для Windows / Linux - без кода c - PullRequest
0 голосов
/ 21 марта 2012

Я хочу добавить в свой проект функцию GPS: я хочу записывать предложения GPS во время вождения и после этого, чтобы собрать собранную информацию (в основном информацию о синхронизации и синхронизации) в какой-то структуре данных.1001 *

кто-нибудь знает бесплатный код c, доступный онлайн на windows / linux для этого?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Большинство GPS-приемников выводят информацию о местоположении, используя протокол NMEA, вам нужен анализатор NMEA, написанный на C, посмотрите Библиотека NMEA в качестве примера.

Библиотека содержитколичество примеров приложений, вероятно, простейшее для понимания / реализации, находится в каталоге * 1005. *

#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.

0 голосов
/ 21 октября 2015

В Linux вы можете использовать библиотеку C libnmea для анализа предложений NMEA. Это действительно легко использовать и легко реализовывать новые типы предложений, если вы обнаружите пропущенные.

libnmea на 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
...