Go Down

Topic: EEPROMAnything (Read 590 times) previous topic - next topic

fti7

Hallo Zusammen,

ich möchte gern ein größeres Struct Array im EEPROM Speichern, funktioniert soweit mit EEPROMAnything ganz gut.

Allerdings ändern sich die ein oder anderen Daten in diesem Struct die ich dann zurück ins EEPROM schreiben will.

Leider schreibt EEPROM_writeAnything immer alle Daten statt nur diese die sich geändert haben.

eeprom_update_byte kann ich leider nicht nutzen, da es scheinbar nicht in der Arduino EEPROM Library vorhanden ist.

Drum wollte ich die EEPROM_writeAnything Funktion soweit umschreiben das sie erst den EEPROM ausließt, mit dem zu schreibenden Wert vergleicht und erst dann schreibt wenn der neue Wert anderst ist.

Leider habe ich wohl irgendwo einen Denkfehler drin... einige Blöcke scheint er immer zu schreiben (Egal ob sich Daten ändern oder nicht)

Wenn ich Explizit Daten ändere (Counter hochzähle) dann scheint ihn dass meist nicht zu interessieren....

Könnte vielleicht mal einer drüberschauen?

Danke!

Gruß,
Frank

Original:

Code: [Select]

template <class T> int EEPROM_writeAnything(int ee, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++)
          EEPROM.write(ee++, *p++);
    return i;
}


Mein "Versuch":
Code: [Select]

template <class T> int EEPROM_updateAnything(int ee, const T& value)
{
    const byte* p = (const byte*)(const void*)&value;
    unsigned int i;
    for (i = 0; i < sizeof(value); i++) {
       if (memcmp((const byte*)EEPROM.read(ee), (const byte*)*p, 8) == 0) {
         // Gleich - Nicht schreiben
       } else {
          // Ungleich - Schreiben
          EEPROM.write(ee, *p);
        }
        ee++;
        *p++;
    }
    return i;
}

uwefed

#1
Mar 17, 2013, 05:06 am Last Edit: Mar 17, 2013, 08:16 pm by uwefed Reason: 1
Wieso machst Du es mit memcmp() und kontrollierst 8 Bytes?
Wenn Du nur 1 Byte schreibst, mußt Du auch nur 1 Byte lesen bzw vergleichen.

Code: [Select]
template <class T> int EEPROM_writeAnything(int ee, const T& value)
  {
  const byte* p = (const byte*)(const void*)&value;
  for (int i = 0; i < sizeof(value); i++)
    {
    if (EEPROM.read(ee) !=*p)
      {
      EEPROM.write(ee++, *p++);
      }
    }
  }

Habs nicht getestet darum hoffe ich es ist kein Fehler drin.
Grüße Uwe

MaFu


Wieso machst Du es mit memcmp() und kontrollierst 8 Bytes?
Wenn Du nur 1 Byte schreibst, mußt Du auch nur 1 Byte lesen bzw vergleichen.

Code: [Select]
template <class T> int EEPROM_writeAnything(int ee, const T& value)
 {
 const byte* p = (const byte*)(const void*)&value;
 for (int i = 0; i < sizeof(value); i++)
   {
   if (EEPROM.read(ee) !=*p)
     {
     EEPROM.write(ee++, *p++);
     }
   }
 }

Habs nicht geteste darum hoffe ich es ist kein Fehler drin.
Grüße Uwe

Leider doch. Du erhöhst ee und p nur wenn geschrieben wird, es muss aber immer erhöht werden.
Code: [Select]
template <class T> int EEPROM_writeAnything(int ee, const T& value)
 {
 const byte* p = (const byte*)(const void*)&value;
 for (int i = 0; i < sizeof(value); i++)
   {
   if (EEPROM.read(ee) !=*p)
     {
     EEPROM.write(ee, *p);
     }
    ee++;
    p++;
   }
 }
_______
Manfred

fti7

Oh man - Ich Trottel..... sah wohl den Wald vor lauter Bäumen nicht...


Vielen Dank für eure Hilfe!


Gruß,
Frank

Go Up