HEX conversion mit sprintf
hallo,
ich habe eine kleine funktion geschrieben, zum anhängen einer nmea-checksumme einen nmea-datensatz. dabei habe ich das problem, dass bei jedem 20.-30. datensatz die checksumme nicht korrekt übergeben wird. wenn ich das überprüfe, und vor dem return die checksumme per serial.print ausgebe, sehe ich, dass die soweit i.o. ist. nur die Übergabe scheint nicht hinzuhauen (es steht dann einfach nur eine "4" da). ich nehme an, da das restliche programm sehr groß ist (binary sketch size: 18492 bytes), dass sich da in den variablen überscheibt. die checksumme hänge ich in einem anderen programmteil per strcat den datensatz an.
strcpy( outbuf, "nmea-datensatz ohne cs");
strcat( outbuf, checksum(outbuf));
strcat( outbuf, "\r\n");
serial.print(outbuf);
ich schätze also, dass mit sprintf nun den speicher zu stark beansprucht, und suche nach einer alternative. alles ich bisher zum ersetzen von sprinft gefunden habe, bezog sich eher auf das umwandeln von floats nach ascii.
hat jemand eine idee?
gruß
j
ich habe eine kleine funktion geschrieben, zum anhängen einer nmea-checksumme einen nmea-datensatz. dabei habe ich das problem, dass bei jedem 20.-30. datensatz die checksumme nicht korrekt übergeben wird. wenn ich das überprüfe, und vor dem return die checksumme per serial.print ausgebe, sehe ich, dass die soweit i.o. ist. nur die Übergabe scheint nicht hinzuhauen (es steht dann einfach nur eine "4" da). ich nehme an, da das restliche programm sehr groß ist (binary sketch size: 18492 bytes), dass sich da in den variablen überscheibt. die checksumme hänge ich in einem anderen programmteil per strcat den datensatz an.
strcpy( outbuf, "nmea-datensatz ohne cs");
strcat( outbuf, checksum(outbuf));
strcat( outbuf, "\r\n");
serial.print(outbuf);
ich schätze also, dass mit sprintf nun den speicher zu stark beansprucht, und suche nach einer alternative. alles ich bisher zum ersetzen von sprinft gefunden habe, bezog sich eher auf das umwandeln von floats nach ascii.
hat jemand eine idee?
gruß
j
code: [select]
char* checksum(char* csbuf){
char csout[4];
// vorige checksumme löschen
int cs=0;
// ohne '$'
for (int n=1; n < strlen(csbuf)+1; n++) {
// berechnen der checksumme
cs ^= csbuf[n];
}
// formatieren in zweistellig, führende null in hex
sprintf(csout, "*%02x\0" , cs);
return csout;
}
hallo jürgen,
das ist kein problem von sprintf, sondern ein fehler in deinem programm. du gibt die adresse einer lokalen variablen auf dem stack zurück, die längst überschrieben worden sein könnte.
es gibt zwei einfache lösungsmöglichkeiten:
a) den string für den hexwert als parameter die funktion übergeben
b) den string nicht statisch (also char csout[4]), sondern dynamisch per malloc() zu reservieren - dann musst du ihn aber in der aufrufenden funktion auch wieder freigeben.
warum hast du eigentlich csout in der länge von 4 definiert? brauchst du wirklich 3 zeichen für die hex-zahl?
ciao,
rudi
das ist kein problem von sprintf, sondern ein fehler in deinem programm. du gibt die adresse einer lokalen variablen auf dem stack zurück, die längst überschrieben worden sein könnte.
es gibt zwei einfache lösungsmöglichkeiten:
a) den string für den hexwert als parameter die funktion übergeben
b) den string nicht statisch (also char csout[4]), sondern dynamisch per malloc() zu reservieren - dann musst du ihn aber in der aufrufenden funktion auch wieder freigeben.
warum hast du eigentlich csout in der länge von 4 definiert? brauchst du wirklich 3 zeichen für die hex-zahl?
ciao,
rudi
Arduino Forum > International > Deutsch (Moderator: uwefed) > HEX conversion mit sprintf
arduino
Comments
Post a Comment