Функция парсера GPS не работает с новым приемником - PullRequest
0 голосов
/ 26 марта 2019

Я использую старое устройство (2006 год - чрезвычайно урезанный встроенный Linux), чтобы получить широту и долготу GPS от внешнего приемника.Координаты GPS отображаются на ЖК-дисплее устройства.Раньше он работал нормально, пока оригинальный GPS-приемник не вышел из строя.Они заменили его на новый приемник, но теперь он больше не работает, все, что я вижу на ЖК-дисплее: Широта: - / Долгота: -.

Я попытался проверить, работает ли новый приемник GPS.И кажется, что пакеты GPGGA есть.Старое устройство ожидает пакеты GPGGA для анализа / обработки.

char GPSLatBuf[12], GPSLonBuf[12];

int parseGPSData(char * gpsBuffer)
{
  char * p;
  char gpsQuality = '0';

  if((p = strstr(gpsBuffer, "$GPGGA")) == NULL)
     return -1;

  memset(GPSLatBuf, 0, sizeof(GPSLatBuf));
  memset(GPSLonBuf, 0, sizeof(GPSLonBuf));

  p += 7; // UTC time
  if(*p != ',') 
  {
     p += 10; // Latitude
     if(*p != ',') 
     {
        memcpy(&GPSLatBuf[1], p, 9);
        p += 10; // N/S Hemisphere
        if(*p != ',') 
        {
           GPSLatBuf[0] = (*p == 'N') ? '+' : '-';
           p += 2; // Longitude
           if(*p != ',') 
           {
              memcpy(&GPSLonBuf[1], p, 10);
              p += 11; // E/W Hemisphere
              if(*p != ',') 
              {
                 GPSLonBuf[0] = (*p == 'E') ? '+' : '-';
                 p += 2; // GPS quality
                 if(*p != ',')
                    gpsQuality = *p;
              }
           }
        }
     }
  }
  if(gpsQuality == '0')
     return -1;

  return 0;
}

Ожидается, что будут отображаться не пустые поля, как раньше: +4916.4600 / -12311.1200 (просто пример, поскольку я сейчас ничего не вижу на дисплее).

1 Ответ

0 голосов
/ 27 июня 2019

Надеюсь, еще не поздно.
Идея такова: количество десятичных цифр данных внутри сообщения GPGGA как-то специфично для модуля GPS.
Следовательно, ваш код имеет здесь проблему, поскольку он использует фиксированные смещения для поиска широты, долготы и т. Д.
Это легко исправить: вместо использования фиксированных смещений вы должны искать разделитель (в данном случае ",") с помощью функции strstr ().
Вот исправленный код:

int parseGPSData(char * gpsBuffer)
{
  char * p;
  char gpsQuality = '0';

  if((p = strstr(gpsBuffer, "$GPGGA")) == NULL)
     return -1;

  memset(GPSLatBuf, 0, sizeof(GPSLatBuf));
  memset(GPSLonBuf, 0, sizeof(GPSLonBuf));

  if((p = strstr(p, ",")) != NULL)
  {
      p++; // there is UTC time
      if((p = strstr(p, ",")) != NULL)
      {
          p++; // Latitude
          memcpy(&GPSLatBuf[1], p, 9);
          if((p = strstr(p, ",")) != NULL)
          {
              p++; // N/S Hemisphere
              GPSLatBuf[0] = (*p == 'N') ? '+' : '-';
              if((p = strstr(p, ",")) != NULL)
              {
                  p++; // Longitude
                  memcpy(&GPSLonBuf[1], p, 10);
                  if((p = strstr(p, ",")) != NULL)
                  {
                      p++; // E/W Hemisphere
                      GPSLonBuf[0] = (*p == 'E') ? '+' : '-';
                      if((p = strstr(p, ",")) != NULL)
                          gpsQuality = p[1];
                  }
              }
          }
      }
  }

  if(gpsQuality == '0')
     return -1;

  return 0;
}  

Я почти уверен, что это решит вашу проблему:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...