ESP32 - EEPROM Bug?

Guten Tag,

ich will auf meinem ESP32, die IP Adressen vom Client im Flash abspeichern.
Ansicht funktioniert es, aber halt auch nicht so ganz.

Mal ein kurzes Beispiel:

EEPROM.begin(170);
String ip = "123.123.123.123";
int address = 0;
EEPROM.writeString(address, ip);
address = ip.length() +1;
EEPROM.commit();

address = 0;
ip = EEPROM.readString(address);

So ist bei mir der Ablauf. Ändere ich was im Flash folgt danach ein commit.

Möchte ich eine ip Adresse löschen, überschreibe ich die ip mit einem leeren String und mache ein commit.
Aber das funktioniert nicht so ganz. Selbst wenn ich es mit einem Dummy Wert überschreibe funktioniert es nicht.

Ist da ein Bug oder habe ich irgendwas vergessen?
mfg werdas34

werdas34:
Aber das funktioniert nicht so ganz.

Was bedeutet das?

Gruß Tommy

Möchte ich die IP überschreiben mit einem leeren String "" oder einem Dummy Wert "dummy" wird dieser nicht an die Adresse der IP geschrieben. Die IP steht unverändert im EEPROM und der leere String oder Dummy Wert eben nicht.

// zuvor steht an der Addresse 0 eine IP-Adresse
EEPROM.writeString(0, "");
EEPROM.commit();
// es steht immer noch die IP-Addresse an Stelle 0

Ich frage immer den ganzen String ab, Sollte wirklich nur der eine Byte beim leeren String sich ändern, dann würde ich das auch sehen.

Unten mal der Code wie er bei mir im Projekt steht. Vieleicht habe ich irgendwas übersehen.
Was soll er machen: Ich habe ein Array von Strings, in diesen sind die IP-Adressen gespeichert.
Lösche ich eine Adresse aus der Mitte werden die nachfolgenden Adressen, um eine Position nach vorne verschoben. Es ensteht keine Lücke im Array.
Das Array macht genau das was ich möchte. EEPROM macht das aber nicht so.
Die gelöschte IP-Adresse soll mit einer neuen überschrieben werden.
Es wird aus dem EEPROM aber gar keine gelöscht.
Es sieht am Ende genauso aus wie am Anfang im Flash.

// return removed ip value
String removeIPFromCam(int index){
  int address = 0;
  if(index < 0 || ALL_CAMS_IP_SIZE -1 < index){
    return "";
  }
  // remove ip
  String str = allCamsIP[index];
  Serial.println("Removed " + str);
  allCamsIP[index] = "";
  address = (IP_ADDRESS_SIZE + 1) * index;
  EEPROM.writeString(address, "xxx.xxx.xxx.xxx");
  Serial.println(EEPROM.readString(address));
  
  // shift ip to empty position
  for (int i = index; i < ALL_CAMS_IP_SIZE -1; i++){
      allCamsIP[i] = allCamsIP[i +1];
      address = (IP_ADDRESS_SIZE + 1) * index;
      EEPROM.writeString(address, allCamsIP[i +1]);
  }
  EEPROM.commit();
  
  address = 0;
  for(int i = 0; i < 10; i++){
    Serial.println(EEPROM.readString(address));
    address += IP_ADDRESS_SIZE + 1;
  }
  
  allCamsIP[ALL_CAMS_IP_SIZE -1] = "";
  return str;
}

werdas34:

   // shift ip to empty position

for (int i = index; i < ALL_CAMS_IP_SIZE -1; i++){
     allCamsIP[i] = allCamsIP[i +1];
     address = (IP_ADDRESS_SIZE + 1) * index;
     EEPROM.writeString(address, allCamsIP[i +1]);
 }
 EEPROM.commit();
}

Ist das so gewollt: Im Array rücken alle Adressen ab der gelöschten Stelle um eins vor, im EEPROM schreibst Du aber immer auf die gleich Adresse, denn 'address' ändert sich nicht, da dein 'index' in der Schleife nicht verändert wird.

MicroBahner:
Ist das so gewollt: Im Array rücken alle Adressen ab der gelöschten Stelle um eins vor, im EEPROM schreibst Du aber immer auf die gleich Adresse, denn 'address' ändert sich nicht, da dein 'index' in der Schleife nicht verändert wird.

Vielen DANK.
Statt index in der address Berechnung muss nur ein i stehen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.