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