ich bin absoluter Anfänger und bastle gerade mit einem ESP32 (Heltec Wireless Tracker) und einem Standard-Micro-SD-Karten-Shield. Mir ist schon einiges gelungen, beispielsweise konnte ich das Shield mit dem Board verbinden, die SPI-Pins definieren (das Board hat nur sehr wenige freie Pins, da es mit einer Reihe von eigener Hardware daherkommt) und eine Verbindung mit der SD-Karte aufbauen. Die Beispielprogramme laufen einwandfrei.
Nun habe ich ein eigenes Programm geschrieben, das Daten vom GPS-Empfänger sammelt und auf SD-Karte schreibt. Das läuft eigentlich auch, aber nur eine Weile. Irgendwann schreibt es nicht mehr auf die SD-Karte (genauer: das SD.open liefert null).
Nun könnt Ihr natürlich nicht raten, woran es liegt - meine Frage ist: habe ich irgendeine Chance, eine Fehlermeldung zu finden? WARUM ist das SD.open fehlgeschlagen?
Es kann ja an tausend Dingen liegen, beispielsweise bin ich ein miserabler Löter und die Stiftleisten-Lötstellen sehen wirklich furchtbar aus. Ich hab mich sowieso gewundert, dass es überhaupt geht, aber da es grundsätzlich geht, muss ich ja irgendwas richtig gemacht haben.
Wenn ich eine Fehlermeldung hätte, aus der ich erkennen kann, ob es an meiner Software liegt oder an der Hardware, wäre mir schon extrem geholfen.
Ohne Sketch können wir nur würfeln.
Machst Du zum mehrfachen SD.open() auch zwischendurch SD.close()?
Eigentlich braucht man SD.open() nur ein Mal im setup().
Ich hab meine Frage vielleicht unpräzise gestellt, was ich eigentlich meinte war:
Wenn bei SD.open ein Fehler passiert, bekomme ich ja einfach null zurück. Gibt es in der SD-Library auch eine Möglichkeit, die eigentliche Fehlermeldung oder eine Art Fehlercode auszulesen? Ich habe leider weder im Quelltext noch im Internet Informationen dazu gefunden.
Warum ignorierst Du unsere Fragen und Bitten um Schaltung und Sketch. Den bitte in Codetags. Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.
Das ist ein interessanter Hinweis. Ich mache immer, wenn ich einen Datensatz schreibe (im Moment einfach mal alle 15 Sekunden) einmal open() und einmal close(). Ich dachte, so wäre ich vielleicht auf der sicheren Seite, dass die Daten auch wirklich geschrieben sind.
Den Ansatz, die Datei nur einmal im setup() zu öffnen, werde ich ausprobieren!
Du bringst gerade SD.open/close - die Karte und file.open/close - die Datei durcheinander.
Aber ohne Sketch klinke ich mich dann aus. Ich habe keine Lust auf Rätselraten.
SD.open ist erforderlich, wenn zwischendurch die Karte entfernt und wieder (oder gar eine andere) eingesetzt worden sein kann. In diesem Fall kann man sich aber einige Fehler einfangen, und sollte sich möglichst das Leben (den Code) vereinfachen, dass man die Karte nur bei abgeschaltetem Arduino wechselt.
Hey, jetzt zerreißt mich doch nicht gleich ... Ich hab ja mittlerweile eingesehen, dass ich meine Frage doof formuliert habe. Eigentlich war ich ja nur auf der Suche nach einer ausführlicheren Dokumentation zur SD-Library, in der auch Fehlerbehandlung erklärt wird, damit ich mir das anlesen kann. Ich wollte Euch ja gar nicht die Mühe antun, meinen Quelltext zu lesen.
Es ist halt viel GPS-Krempel drin, der nichts mit SD zu tun hat. Ich versuche, das mal aufs Wesentliche zusammenzukürzen.
Interessant finde ich den Hinweis, dass ich mit SD.open / SD.close den ganzen SD-Karten-Stack öffne und schließe. Das hatte ich bisher total anders verstanden, da ja SD vom Typ SDFS ist, was seinerseits von FS ableitet. Somit dachte ich, das SD.open sei einfach genau das FS.open.
#define SCK 5
#define MISO 7
#define MOSI 6
#define CS 4
SPIClass mySPI;
char outbuf[500];
char zeit[10];
char datum[7];
void setup() {
Serial.begin(115200);
mySPI.begin(SCK, MISO, MOSI, CS);
while (!SD.begin(CS, mySPI)) {
delay(1000);
}
}
...
void flush() {
char name[30];
strcpy(name,"/GNSSDATA-20yymmddhh.log");
name[12]=datum[4];
name[13]=datum[5];
name[14]=datum[2];
name[15]=datum[3];
name[16]=datum[0];
name[17]=datum[1];
name[18]=zeit[0];
name[19]=zeit[1];
if (Serial) {
Serial.printf("Flush nach %s\n", name);
}
File myFile=SD.open(name,FILE_APPEND, true);
if (myFile) {
myFile.print(outbuf);
myFile.close();
if (Serial) {
Serial.printf("Schrieb erfolgreich auf SD-Karte %s\n",name);
}
} else {
if (Serial) {
Serial.println(outbuf);
Serial.printf("Problem beim Schreiben auf SD-Karte nach %s\n", name);
}
}
}