Salut Kamill,
Oui j'ai vu au meme moment ou tu m'a répondu.
Que veux tu dire par
sinon tu fais des appels à strtok_r uniquement avec l'adresse NULL
Es-ce juste de faire ainsi.
J'ai corrigé donc l'erreur que tu as relevé et ca fonctionne bien mieux!!!
Mais il y a un truc qui me rend fou!
Voci mon code que j'ai corrigé. Tu observera que j'ai volontairement inversé le jour et la date
210915 => 092115
En fait la chaine que traite fini par l'heure et je pense qu'il y a un \0 apres les seconde. Et je pense que ca cause mon deuxieme problem et qui me rend fou
Voici donc le code
#ifdef DEBUG_GPS
sprintln((char *)comm_buf);
#endif
// 0,6.141163,46.219819,2015/09/25,19:15:20
cha = strtok_r((char *)comm_buf,",",&saveptr1);
//sprint(F("First index of strtok 1:"));sprintln(cha);
if(atoi(cha) > 0)
{
#ifdef DEBUG_GPS
Serial.print(F("Loc ERR:"));
Serial.println(atoi(cha));
#endif
strncpy(fix,strtok(fix,","),FIXSIZE);
strncat(fix,",,V,,,,,,,,,,",FIXSIZE);
result = -1;
}
else
{
c = 0;
d = 0;
h = 0;
// ai = 4;
do
{
Serial.print(F("cha: "));
Serial.println(cha);
switch(c){
case 0:
cha = strtok_r(NULL,",",&saveptr1);
lon = cha;
// Serial.println(lon);
break;
case 1:
cha = strtok_r(NULL,",",&saveptr1);
lat = cha;
// Serial.println(lat);
break;
case 2:
cha = strtok_r(NULL,",",&saveptr1);
aa = strtok_r(cha,"/",&saveptr2);
mm = strtok_r(NULL,"/",&saveptr2);
dd = strtok_r(NULL,"/",&saveptr2);
Serial.println(strlen(dd));
Serial.print(F("aa:"));
Serial.println(aa);
Serial.print(F("mm:"));
Serial.println(mm);
Serial.print(F("dd:"));
Serial.println(dd);
strncpy(day,mm,2);
strncat(day,dd,2);
strncat(day,aa+2,2);
Serial.println(day);
Serial.println(strlen(day));
Serial.println(sizeof(day));
break;
case 3:
cha = strtok_r(NULL,",",&saveptr1);
for (hr=cha; *hr; hr++)
{
if (*hr!=':' && *hr!='\n' && *hr!='\r')
{
// Serial.print(*hr);
hour[h++] = *hr;
}
}
hour[h]='\0';
break;
case 4:
cha = strtok_r(NULL,",",&saveptr1);
#ifdef DEBUG
// sprint(F("?:"));
// sprintln(cha);
#endif
break;
default:
cha = strtok_r(NULL,",",&saveptr1);
#ifdef DEBUG_GPS
Serial.print(F("Def : "));
sprintln(cha);
#endif
} // End switch
c++;
}while(cha != NULL);
/*
#ifdef DEBUG_GPS
sprint(F("Lon:\t\t\t\t"));
sprintln(lon);
sprint(F("lat:\t\t\t\t"));
sprintln(lat);
sprint(F("Day:\t\t\t\t"));
sprintln(day);
sprint(F("Hour:\t\t\t\t"));
sprintln(hour);
#endif
*/
strncpy(fix,strtok(fix,","),FIXSIZE);
strncat(fix,",",1);
strncat(fix,hour,4); // Hour
strncat(fix,".00,V,",6); // Status
strncat(fix,lat,FIXLEN); // lat
strncat(fix,",,",2); // N/S
strncat(fix,lon,FIXLEN); // lon
strncat(fix,",,,,",4); // E/W, Speed, Course,
strncat(fix,day,6); // Date
strncat(fix,",,,",3); // MAgetisma, Mode, Checksom
#ifdef DEBUG_GPS
sprint(F("fix2:\t\t\t\t"));
sprintln(fix);
Serial.println(strlen(fix));
#endif
result = 1;
}
}
et voii ce que ca affiche:
0,6.141164,46.219818,2015/09/30,16:46:23
cha: 0
cha: 6.141164
cha: 46.219818
2
aa:2015
mm:09
dd:30
09^3015
7
7
cha: 2015
cha: 16:46:23
fix2: cid=0&mnc=00&mcc=000&lac=0&gprmc=$GPRMC,1646.00,V,46.219818,,6.141164,,,,09^301,,,
82
tu voix il y a un mauvais caratere entre le mois et le jour?
Ce mauvais caracter ne se voit pas en HTML. Je le remplace par un ^
09^3015
Si je remets comment avant
strncpy(day,dd,2);
strncat(day,mm,2);
strncat(day,aa+2,2);
30^0915
Ben ca fait la meme chose. Une fois j'ai vu un 'q' avec deux mauvais caracrteres, entre le jour et le mois.
30^q^0915
Je n'arrive pas a comprendre pourquoi j'ai ce mauvais caractere. Pourtant, j'utilise strncat() et je defini 2 caracteres. Donc si à la fin, il y a un \0, il ne devrait pas le prendre??? non?