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
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
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.
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
Ja, das Problem ist das die Kopie des Strings den man einlesen will noch gar nicht existiert, und somit auch deren länge nicht ermittelt werden kann. Aber da ich weiss das der String die länge des orginals haben sollte, kann ich ja auch deren länge nehmen :-).
>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..
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.