Moin,
ich habe eine Methode die mit einem String aufgerufen werden soll, dann
eine Checksume dranhängt und das ganze per UART von PeterFleury
versendet.
Das sieht so aus:
1
staticcharcalculate_checksum(chardata[]){
2
charchecksum=0x00;
3
for(uint8_ti=0;i<strlen(data);i++){
4
checksum^=data[i];
5
}
6
returnchecksum;
7
}
8
voidsend_uart_message(charmessage[]){
9
charchecksum=calculate_checksum(message);
10
charbuffer[100];
11
strcpy(buffer,"$");
12
strcat(buffer,message);
13
strcat(buffer,"*");
14
charchecksum_string[2];
15
sprintf(checksum_string,"%02X",checksum);
16
strcat(buffer,checksum_string);
17
strcat(buffer,"\r\n");
18
uart_puts(buffer);
19
}
Das ganze funktioniert nun, wenn ich es mit
1
send_uart_message("ABC");
aufrufe, ich möchte aber eigentlich soetwas machen, was aber zu einem
Dauer-Reset führt:
Jan H. schrieb:> char checksum_string[2];> sprintf(checksum_string, "%02X", checksum);
dein Checksum_string ist zu kurz, checksum kann ja scheinbar bis 255
werden. Dazu kommt noch das 0 Byte. Also sollte er mindestens 4byte lang
sein.
> for (uint8_t i = 0; i < strlen(data); i++) {
ist etwas ungünstig, im Zweifelsfall wird stündig strlen aufgerufen.
for( uint8_t i = 0; data[i]; i++) {
Peter II schrieb:> dein Checksum_string ist zu kurz, checksum kann ja scheinbar bis 255> werden. Dazu kommt noch das 0 Byte. Also sollte er mindestens 4byte lang> sein.
Drei reichen bei hexadezimaler Darstellung. Aber drei müssen es schon
sein.
Jo danke nun funzt es, an "\0" hätte ich ja mal denken können -.-
Wundert mich nur, dass es mit "ABC" inkl. Checksumme funktioniert hat.
Peter II schrieb:> ausßerdem ist ist überhaupt nicht notwendig den string komplett> zusammenzubauen, kostet nur zeit uns stack.> sollte das gleiche machen, aber etwas weniger speicher brauchen.
Jo, wo du es sagst...Warum eigentlich nicht !
Jan H. schrieb:> Wundert mich nur, dass es mit "ABC" inkl. Checksumme funktioniert hat.
Das dumme an undefiniertem Verhalten ist, das alles mögliche passieren
kann. Inklusive dem Verhalten, welches du erwartet hast.
Das bedeutet allerdings nicht, dass es deshalb in Ordnung wäre.
Fehlerhaft ist fehlerhaft, selbst wenn zufällig das richtige rauskommt,
weil du zufälig gerade irgendein momentan nicht benutztes Byte im
Speicher niedergebügelt hast. Bei der nächsten Programmänderung oder
-erweiterung kann das alles schon wieder ganz anders aussehen.