EEPROM read_block

Gast #959583
Lesenswert?

hallo,
ich möchte mich mit dem Kapitel eeprom beschäftigen.
Nachdem ich das Tutorial gelesen habe, versuche ich einige Variable in 
Eeprom zu schreiben/lesen.Ich habe einige Beispiele gewählt.
Das Lesen/Schreiben ein Byte und read_block(für int)funktioniert.Für die 
andere Fälle bekomme ich komische Werte. Weiß jemanden,wo ich Fehler 
mache.
Anbei meine Code.
hier sind die Werte, die ich mit der Funktion sprintf bekomme.
:eeeeprom lesen: 123

:eeprom schreiben: 99

:eeprom scheiben: 0

:eeprom lesen: 30

:eeprom schreiben: Ú

:eeprom lesen:

Auf alle Hilfe bin ich sehr dankbar
Angehängte Dateien:
#959608
Lesenswert?

Hallo,

 hm ... ich empfehle dir nochmal ein C-Buch in die Hand zu nehmen. Der 
Code ist leider sehr unübersichtlich und ich glaube du solltest dir 
nochmal genau Stringverarbeitung und Behandlung ansehen und außerdem die 
unterschiedlichen Typen an Variablen (int, char, ...).
 Aus dem angefügten Code entnehme ich das du eigentlich im letzten Teil 
den String ins EEProm kopieren willst und wieder einlesen willst, oder 
liege ich da falsch ?

CA Dirk
#959718
Lesenswert?

Hier mal ein Beispiel, habe jetzt gerade keine möglichkeit zu testen. 
Aber vom Prinzip sollte es richtig sein. Werde ich aber testen wenn ich 
wieder zu hause bin. Hab auch der Einfachhalber mal die Headerdateien 
weglassen.
1
char EEpromString[30] EEMEM;      /* String in EEprom*/
2
char StringOrginal[30]="Teststring";   /* String im Ram*/
3
char StringKopie[30];        /* String Kopie im Ram */
4

5
void main(void)
6
{
7
      UART0_Init();
8
      char tempstr[60];
9

10
      /* String aus dem Ram ins EEprom kopieren*/
11
      eeprom_write_block( &StringOrginal, &EEpromString, strlen( StringOrginal) );
12
      sprintf(tempstr,"eeprom Schreiben: %s\n", &StringOrginal );
13
      Meldung(tempstr);
14

15
      /* String aus dem EEprom ins Ram kopieren*/
16
      eeprom_read_block( &StringKopie, &EEpromString, strlen( StringOrginal) );
17
      sprintf(tempstr,"eeprom lesen: %s\n", &StringKopie );
18
      Meldung(tempstr);  
19
}

Als erstes wird der String (StringOrginal) ins EEprom (EEpromString) 
geschrieben mit anschliessender Ausgabe des Strings. Danach wird der 
String aus dem EEprom (EEpromString) wieder ins RAM (StringKopie) 
kopiert und wieder ausgegeben.
Beide Ausgaben sollten identisch sein wenn alles geklappt hat.
Gast #959812
Lesenswert?

Hallo Dirk,
eine kleine Frage warum nicht nimmst Du die strlen(StringOrginal) in der 
Funktion:eeprom_read_block( &StringKopie, &EEpromString, strlen( 
StringOrginal).  ich denke man muss  strlen( StringKopie).
Danke
Gast #960103
Lesenswert?

>Ja, das Problem ist das die Kopie des Strings den man einlesen will noch
>gar nicht existiert,

Aber die Länge der Variablen ist mit sizeof bestimmbar.

Und ich denke, das sollte dahin, weil dann das eeprom-read-block weiß, 
wie groß der puffer maximal ist. sonst könnten nachfolgende variablen 
überschrieben werden..
#960268
Lesenswert?

Matthias Lipinsky wrote:
>>Ja, das Problem ist das die Kopie des Strings den man einlesen will noch
>>gar nicht existiert,

> Aber die Länge der Variablen ist mit sizeof bestimmbar.
>
> Und ich denke, das sollte dahin, weil dann das eeprom-read-block weiß,
> wie groß der puffer maximal ist. sonst könnten nachfolgende variablen
> überschrieben werden..
>
Stimmt. Aber da muss der Programmierer sich schon darum kümmern wenn er 
den kompletten String wieder haben will. Deshalb meine Anmerkung zu 
Stringverarbeitung. Aber das ist eine eigenes Thema für sich :-)

CA Dirk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren