ESP32 --> SD.open --> Anlegen einer Datei in einem Ordner funktioniert nicht

Hi,

sorry, ich muss euch schon wieder nerven.
Ich hab schon wieder einen Unterschied zwischen dem ESP8266 und dem ESP32 festgestellt:

#include "FS.h"
#include "SD.h"
#include "SPI.h"
const byte SDPin = 5;
File file;

void setup() {

  Serial.begin(115200);
  delay(2000);
  if (!SD.begin(SDPin)) {
    Serial.println("SD-Karte NICHT erkannt!");
  } else {
    Serial.println("SD-Karte erkannt.");  
  }

  //  Das hier funktioniert
  file = SD.open("/Test.txt", FILE_WRITE); // Funktioniert 
  if(!file){
      Serial.println("Datei kann nicht zum Schreiben geöffnet werden");
      return;
  }
  if(file.print("Das ist ein Test 1")){
      Serial.println("Datei 1 geschrieben");
  } else {
      Serial.println("Fehler bei Datei 1");
  }
  file.close();

  // Das hier funktioniert NICHT
  file = SD.open("/Unterordner/Test.txt", FILE_WRITE); 
  if(!file){
      Serial.println("Datei kann nicht zum Schreiben geöffnet werden");
      return;
  }
  if(file.print("Das ist ein Test 2")){
      Serial.println("Datei 2 geschrieben");
  } else {
      Serial.println("Fehler bei Datei 2");
  }
  file.close();
}


void loop() {
  //
}

Diese Zeile hier macht Probleme:

file = SD.open("/Unterordner/Test.txt", FILE_WRITE);

Beim ESP 8266 konnte ich direkt eine Datei inklusive Unterverzeichnis anlegen.
Beim ESP32 kommt dann "Datei kann nicht zum Schreiben geöffnet werden"...

Habt ihr wieder einen guten Tipp für mich?

Wie gesagt: Beim ESP8266 gings problemlos, daher weiß ich wieder nicht, wo ich mit der Fehlersuche ansetzen soll ;-(

  File root = fs.open(dirname);

Hast Du mal den Weg gewählt, wie das früher üblich war:
a) Verzeichnis anlegen -> in Verzeichnis wechseln -> Datei schreibewn
b) Verzeichnis anlegen --> Datei in dieses Verzeichnis schreiben

Gruß Tommy

Hi,

ja, das hier funktioniert:

SD.mkdir("/Unterordner");
file = SD.open("/Unterordner/Test.txt", FILE_WRITE);

Aber ich fands halt ultrapraktisch, dass das hier

file = SD.open("/Unterordner/Test.txt", FILE_WRITE);

beim ESP8266 direkt funktioniert hat.

Und ich frag ich halt, warum das beim ESP32 nun schon wieder nicht funktioniert.
Das ist doch echt sch***ade, wenn man bedenkt, dass es sich um ein Nachfolgermodell handelt.

Beim ESP8266 konnte ich z.B. einfach eine logdatei folgendermaßen anlegen:

char filename_messung[35];  
sprintf(filename_messung, "/%d/%d-%02d-%02d.bin", 2021, 2021, 12, 10);
file = SD.open(filename_messung, FILE_WRITE);

Gabs den Ordner "2021" schon hat er halt nur die Datei angelegt.
Ansonsten auch gleich das Verzeichnis "on the fly" mit angelegt.

Warum meinst Du immer, der ESP32 wäre der Nachfolger des ESP8266?
Es ist einfach ein anderer Prozessor, für den auch das SDK neu entwickelt wurde.
Der ESP8266 und sein SDK hatten mehr Zeit zum "Reifen".

Gruß Tommy

Das meine nicht nur ich sondern das wird so von Espressif propagiert und steht auch in vielen anderen Stellen des www so, nur ein Beispiel:

Aber ist ja egal und reine Definitionssache.
Letztendlich kommt von einer Firma ein neuer Microcontroller raus, ich verwende eine Library, die SD.h heißt, vorher auch schon so hieß aber auf einmal was nicht mehr kann.

Und das ist als Anwender ärgerlich - basta :wink:

Und deswegen muss alles auf dem ESP32 direkt funktionieren, was auch auf dem ESP8266 funktioniert hat ?

Wenn man seinen Gedanken weiter führt müsste die SD-Lib vom UNO also genau so funktionieren. Die heißt ja auch SD.h :wink:
Naja, wer schon mit - Basta - argumentieren muss, ...

Gruß Tommy

Edit: Der Link ist nicht von Espressif. @basementmedia Zeige mir, wo Espressif das behauptet.

Ja, wenn einem keine besseren Argumente mehr einfallen.

Das Basta war doch nur auf meine persönliche Ansicht bezogen, legt doch nicht immer alles gleich auf die Waagschale. Es sollte heißen "ICH bin eben enttäuscht, wenn sich ein SD.open auf einem Gerät des gleichen Herstellers auf einmal anders verhält -Basta".
Ich war eben der Meinung, dass die SD-Library auf einem ESP8266 die gleiche ist , wie auf einem ESP32. Dann hab ich das mit Prinzip noch nicht verstanden, dass eine library nur weil sie SD.h heißt nicht die gleiche ist.

Ich nutze ja z.B. auch die AceTime Library, die ArduinoJSON-library, usw. und die funktionieren bei beiden ESPs genau gleich, da hat sich kein Befehl/keine Funktion davongeschlichen. Und ich dachte eben, dass es bei anderen Libraries, insbesondere gängigen "Standard"-Libraries auch der Fall ist.

Aber dann hab ich mich getäuscht und sag: Sorry.

Aber hey: Das soll doch auch gar nicht das Thema sein.
Ich will hier nie jemanden beleidigen, das ist nicht meine Art und wirds auch nie sein.

Also Danke für alles, ihr habt mir wieder mal weitergeholfen - Basta :wink:

Die anderen Libs, die Du nennst, sind auch nicht vom Hersteller Espressif adaptierte Libs, wie die SD.

Was meinst Du wie viele LiquidCrystal_I2C-Libs es allein für den Arduino gibt, die völlig untrschiedliche Methoden haben?
Der Name einer Lib sagt noch nichts über deren Inhalt aus. Es gibt auch viele Arduino-Libs, die nicht auf ESP8266/ESP32 laufen oder nur auf einem von beiden.

Gruß Tommy

OK, hab ich dann völlig falsch verstanden. Ich dachte die SD.h wäre quasi immer die gleiche. So wie Nutella eben Nutella ist und wenn einer was anderes macht, dann nennt er es Nuspli.

Ich lerne dazu: SD.h ist nicht gleich SD.h

Hab nochmal eine Frage:

Nun weiß ich, dass man den Ordner erst mit mkdir erstellen muss, bevor man eine Datei darin speichern muss, hab aber das nächste Problem:

Das hier klappt

SD.mkdir("/Unterordner");

Ordner wird erstellt.

Aber wenn ich den Verzeichnisnamen dynamisch generiere

sprintf(ordnername, "/t/%d", 2021);
SD.mkdir(ordnername);

Wird dieser nicht angelegt.

Was mach ich denn schon wieder falsch ;-(

Sieht so aus, als wolltest Du zwei Verzeichnisebenen in einem Call erzeugen:

/t 
/t/2021

Wenn das mit /Verzeichnis/Datei nicht klappt, wird es vermutlich mit /Verzeichnis/Verzeichnis auch nicht gehen.

Stimmt, das wirds sein.
Danke dir.
Teste ich morgen. Für heute sag ich gute Nacht allerseits.

Neuer Tag, neues Problem:

Die Sache mit dem Ordner anlegen funktioniert nun (Danke @wno158 ).

Das letzte, was mir nicht gelingen will:

Beim ESP8266 konnte ich nach dem Öffnen einer BInär-Datei im FILE_WRITE Modus diese durchlaufen und an einer bestimmten Stelle (in meinem Fall eine delete_id) ein Bit ändern:

Hier ein Auszug aus dem Code (Messung ist als Struct angelegt):

bool deleter = true;
auswertungenFile = SD.open("2021-12-10.bin", FILE_WRITE);
if (auswertungenFile) {
          auswertungenFile.seek(0); // Zurück an den Anfang der Datei
          while (auswertungenFile.read((uint8_t *)&Messung, sizeof(Messung)) != 0 && deleter) {
            char delete_id[7];
            sprintf(delete_id, "%d%d%d", Messung.stunde, Messung.minute, Messung.sekunde);
            if (atoi(delete_id) == delete_item) {
              // Zeile gefunden, die als ungültig markiert werden soll
              Messung.valid = false;
              auswertungenFile.seek(auswertungenFile.position() - sizeof(Messung));
              auswertungenFile.write((uint8_t *)&Messung, sizeof(Messung));
              deleter = false;
            }
  yield();
}
auswertungenFile.close();

Das hat so mit der SD.h des ESP8266 super funktioniert.

Bei der SD.h des ESP32 löscht er mir die gesamte Datei.
Ich hab dann das gleiche mal probiert mit FILE_APPEND, also

auswertungenFile = SD.open("2021-12-10.bin", FILE_APPEND);

aber da macht er dann gar nichts.
Und FILE_OPEN wäre ja wahrscheinlich falsch, da ich ja schreiben will.

Ich bin dann auf die Seite der Library und habe gehofft, da was zu den einzelnen Methoden zu finden:

Aber da find ich auch nicht wirklich Antworten.

Könnt ihr mir wieder helfen ;-( ?

Die einzige Möglichkeit, die ich in dem Fall dann sehe, wäre die Datei mit FILE:OPEN zu durchlaufen und parallel eine neuen Datei zuschreiben, die den zu löschenden Wert nicht übernimmt.

Da ich hier nicht weiter komme, hab ich mal ins Englisch-sprachige Forum gepostet.
Falls euch das Thema interessiert, könnt ihr hier gerne mitlesen:

Viele Grüße
Daniel

Hi,

hab die Lösung grad selber gefunden:

auswertungenFile = SD.open("2021-12-10.bin", "r+");

und dann funktionierts.

LG und frohe Weihnachten allen!