Hallo Leute, bin neu hier und habe, trotz umfangreicher Suche, ein Problem mit dem Lesen bzw. Schreiben des EEProm eines attiny85. Habe beiliegendes Programm auf einem Arduino UNO ausgeführt und es läuft einwandfrei. Am attiny85 läuft es aber nur wenn mein String (nummer "+436642") den ich schreiben will bzw. dann zurücklese max. 7-stellig ist. Bei größerem String (ganze Telefonnummer) funktioniert es leider nicht mehr. Die LED´s sind nur zum "debuggen". LG Schmali
... besser so! void write_string(int eeAddr , String data) { for (uint8_t i=0; i!=data.length()+1; i++) { EEPROM.write(eeAddr+i, data[i]); } } String read_string(uint16_t eeAddr) { char getByte, eeData[250+1]; uint8_t i=0; while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) { eeData[i++] = getByte; } data[i] = getByte; return String(eeData); }
... nochmal, besser so! void write_string(uint16_t eeAddr , String data) { for (uint8_t i=0; i!=data.length()+1; i++) { EEPROM.write(eeAddr+i, data[i]); } } String read_string(uint16_t eeAddr) { char getByte, eeData[250+1]; uint8_t i=0; while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) { eeData[i++] = getByte; } eeData[i] = getByte; return String(eeData); }
Brain 2.0 schrieb: > Schon mal mit get oder put versucht ? > https://www.arduino.cc/en/Reference/EEPROMGet Das ist aus 2 Gründen problematisch: 1. String legt die Zeichenkette auf den Heap, der wird von put nicht mitgespeichert. 2. put interessiert sich nicht für Stringlängen.
Das funktioniert so leider nicht. Warum soll die Schleife beim Schreiben um 1x öfter laufen als der String lang ist. Was ist data[Länge+1]? Beim Lesen: Wie weiss sizeof(eeData) wie lang der String ist?
Beitrag #6574055 wurde von einem Moderator gelöscht.
Beitrag #6574069 wurde von einem Moderator gelöscht.
Auf eines möchte ich nochmals hinweisen. Der ursprüngliche Sketch funktioniert solange die Länge des Strings <= 7 ist. Es muss etwas mit dem attiny zu tun haben am Arduino läuft es auch bei größeren Strings.!
Du musst doch wissen, wie lang der String ist - falls Du nicht immer mit derselben Länge arbeiten willst. Also entweder die Länge am Anfang mit abspeichern (Pascal Strings) oder ein Terminator Zeichen an das Ende (C Strings).
kannAllesBesser! schrieb: > String read_string(uint16_t eeAddr) { > char getByte, eeData[250+1]; > uint8_t i=0; > while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) { > eeData[i++] = getByte; > } > eeData[i] = getByte; > return String(eeData); > } .. "vermutlich" ist return BIG string das Problem, daher besser mit global Buffer: char eeData[250+1]; void read_string(uint16_t eeAddr, char *string) { char getByte; uint8_t i=0; while (getByte = EEPROM.read(eeAddr+i) && i!=sizeof(eeData)) { string[i++] = getByte; } string[i] = getByte; String(string); }
Apollo M. schrieb: > char eeData[250+1]; bei RAM Size von 512 und Buffer size von 250 sehe ich Probleme, darum geht es auch mit dem 328/Uno der hat 2K RAM. Die String()Funktion wird zuviel RAM allokieren wollen ... Die Buffer Size musst du überdenken und besser dynamisch als statisch und entsprechend der tatsächlichen string Size!
Danke Apollo M., das war ein guter Ansatz. Ich habe den Code ziemlich gekürzt und die " Unterprogramme" entfernt und direkt im loop integriert und bei den Deklarationen gespart. Ist ja bloß eine Telefonnummer.
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.