Trying to parse nmea with double and strtod

Hi,

I'm trying to build nmea parser, so I have a functionc hecking all nmea sentences and trying to get double value, but I always go bad double value. For example here what I do for VTG sentence

if ((strcmp(&field[0][3], "VTG") == 0) && (f > 8)) {

      LOG_HEXDUMP_INF(field[5], strlen(field[5]), "Field[5]");
      LOG_HEXDUMP_INF(field[7], strlen(field[7]), "Field[7]");

      LOG_INF("Check string for strtod: '%s'", field[5]);
      for (int i = 0; i < strlen(field[5]); i++) {
          LOG_INF("field[5][%d] = 0x%02x", i, field[5][i]);
      }

      LOG_INF("Pointer field[5] = %p", field[5]);

      double ground_speed_kn = strtod(field[5], NULL);
      double ground_speed_kmh = strtod(field[7], NULL);

      snprintf(str, sizeof(str), "speed knt : %5.4lf, speed kmh : %5.4lf", ground_speed_kn, ground_speed_kmh);
      LOG_INF("VTG %s", str);

    }

str is defined like this 

 static char str[128];

And here is my terminal output:

[00:01:28.277,832] <inf> nmea_parser: #0 : $GNVTG
[00:01:28.277,893] <inf> nmea_parser: #1 : 86.89
[00:01:28.277,923] <inf> nmea_parser: #2 : T
[00:01:28.277,954] <inf> nmea_parser: #3 : 
[00:01:28.278,015] <inf> nmea_parser: #4 : M
[00:01:28.278,045] <inf> nmea_parser: #5 : 0.982
[00:01:28.278,076] <inf> nmea_parser: #6 : N
[00:01:28.278,137] <inf> nmea_parser: #7 : 1.819
[00:01:28.278,167] <inf> nmea_parser: #8 : K
[00:01:28.278,198] <inf> nmea_parser: #9 : A
[00:01:28.278,259] <inf> nmea_parser: Field[5]
                                      30 2e 39 38 32                                   |0.982            
[00:01:28.278,289] <inf> nmea_parser: Field[7]
                                      31 2e 38 31 39                                   |1.819            
[00:01:28.278,320] <inf> nmea_parser: Check string for strtod: '0.982'
[00:01:28.278,350] <inf> nmea_parser: field[5][0] = 0x30
[00:01:28.278,350] <inf> nmea_parser: field[5][1] = 0x2e
[00:01:28.278,381] <inf> nmea_parser: field[5][2] = 0x39
[00:01:28.278,381] <inf> nmea_parser: field[5][3] = 0x38
[00:01:28.278,411] <inf> nmea_parser: field[5][4] = 0x32
[00:01:28.278,472] <wrn> cbprintf_package: (unsigned) char * used for %p argument. It's recommended to cast it to void * because it may cause misbehavior in certain configurations. String:"Pointer field[5] = %p" argument:0
[00:01:28.278,503] <inf> nmea_parser: Pointer field[5] = 0x2001c94c
[00:01:28.278,930] <inf> nmea_parser: VTG speed knt : 1133871366.0000, speed kmh : -1099511628.0000

As you can see I have a good value in field[5] (0.982) and pointer addr seems to be good also 0x2001c94c. But strtod always retunr big false number don't unerstand why. In my prj.conf I've added

CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

In fact I don't need double for VTG but I'll have to use double for lat and long,..

Related