C函数strtok中的NMEA故障解析

时间:2018-10-04 19:31:36

标签: c parsing

我在解析NMEA字符串时遇到一些麻烦。有时我有数据,但有时没有。当我没有时,我有2个空插槽。函数strtok会忽略该位置。

这是我的代码:

#include <stdlib.h> 
#include <stdint.h>
#define NUM_SUBSTRINGS 13

struct nmea_parse {
  char sentence[7];
  uint16_t timestamp;
  char *validity;
  float latitude;
  char ns;
  float longitude;
  char ew;
  float speed; //in knots
  uint16_t course;
  uint16_t datestamp;
  uint16_t variation;
  uint16_t ew2;
  uint16_t checksum;
}nmea;

void decodeGPSNMEA(char *);

int main() {
  char str1[] = "$GPRMC,030742.00,A,2232.73830,N,11404.58520,E,0.356,,070314,,,A*A2"; //"$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A";//

  decodeGPSNMEA(str1);
  printf("\nValidity: %s Latitud: %.2f Longitude: %.2f Speed: %.2f Checksum: 0x%X\n\r", nmea.validity, nmea.latitude, nmea.longitude, nmea.speed, nmea.checksum);

  return 0;
}

void decodeGPSNMEA(char *str2) {
  char numb_chek[3];
  char *p, *input[NUM_SUBSTRINGS], i;
  p = strtok(str2, ",");

  for (i = 0; i < NUM_SUBSTRINGS; i++) {
    input[i] = p;
    p = strtok(NULL, ",");
  }

  nmea.validity = input[2];
  nmea.latitude = atof(input[3]);
  nmea.longitude = atof(input[5]);
  nmea.speed = atof(input[7])*1.852;
  nmea.checksum = (int) strtol(input[9] + 2, NULL, 16);

  printf("Hexa: %X", nmea.checksum);

  for (i = 0; i < NUM_SUBSTRINGS; i++)
    printf("\n%d - %s", i, input[i]);
}

output

校验和应该在第12位,在第9位。 NMEA GPRMC始终有13个子字符串,我需要尊重他的位置。

我需要知道如何解决此问题?不要使用strsep或其他任何东西...

0 个答案:

没有答案