So wie du das EEPROM beschreibst, brauchst du die Länge überhaupt nicht
speichern. In C ist jeder gültige String \0 terminiert und enthält somit
implizit seine Längenangabe.
Willst du die Länge speichern, dann musst du allerdings diese
0-Terminierung beim Lesen aus dem EEPROM auch wieder korrekt herstellen.
Das hier
1 | eeprom_read_block( &EepromNummerAusgelesen, eeFooNummer, NummerLaenge ); // Nummer aus dem EEPROM lesen
|
gewährleistet das nicht. Denn NummerLaenge ist die Anzahl der Zeichen
ohne die abschliessende \0 Terminierung.
Da du den String so in den Speicher schreibst:
1 | eeprom_write_block (&uart_string, &eeFooNummer,sizeof(uart_string)); // Nummer ins EEPROM abspeichern
|
steht die \0-Terminierung sowieso im EEPROM (sofern das Ausgangsmaterial
im Array korrekt war). Du könntest daher den String entweder so
zurücklesen
1 | eeprom_read_block( &uart_string, eeFooNummer, sizeof(uart_string)); // Nummer aus dem EEPROM lesen
|
oder so
1 | eeprom_read_block( &EepromNummerAusgelesen, eeFooNummer, NummerLaenge+1 ); // Nummer aus dem EEPROM lesen
|
oder so
1 | eeprom_read_block( &EepromNummerAusgelesen, eeFooNummer, NummerLaenge ); // Nummer aus dem EEPROM lesen
|
2 | EepromNummerAusgelesen[NummerLaenge] = '\0';
|
in all diesen Fällen wird die \0-Terminierung wieder korrekt
hergestellt. Persönlich würde ich die erste Variante nehmen und die
Länge überhaupt nicht im EEPROM speichern.
Und PS:
Bei Arrays brauchst du kein & um es an eine Funktion zu übergeben.
Arrays werden immer so an Funktionen übergeben, dass der Arrayname als
Startadresse des Speicherbereihs fungiert. Genau genommen ist es falsch
hier ein & zu schreiben, nur haben hier die Compilerbauer anscheinend
resigniert und akzeptieren diesen Operator an dieser Stelle. Eigentlich
müsste hier eine Fehlermeldung kommen, denn eine Adresse hat selbst
keine Adresse.