Arduino Crasht bei \n in .txt

Hallo zusammen,

ich möchte 4 Strings in einer Datei speichern und auslesen, der Compiler läuft durch aber der ESP32 crasht sobald die Datei geschrieben wurde und er diese auslesen soll.

"Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled."

Wenn ich die Datei manuell mit einem \r am Zeilenende erzeuge, dann liest er diese auch aus ohne zu crashen, bei \n crasht er. Ich denke also, dass die Funktion zum schreiben \r\n am Ende der Zeilen erzeugt. Wie verhindere ich dies?

// For reading strings on spiffs on startup
void readfiles() {
  char buffer[64];
  int i = 0;

  // 0
  File file0 = SPIFFS.open("/LED0.txt", "r");
  while (file0.available()) {
    int l = file0.readBytesUntil('\r', buffer, sizeof(buffer));
    buffer[l] = 0;
    if (i == 0) {
      lastsbd0 = buffer;
    }
    if (i == 1) {
      lastdguv0 = buffer;
    }
    if (i == 2) {
      ticket0 = buffer;
    }
    if (i == 3) {
      bemerkung0 = buffer;
    }
    i++;
    if (i == 4) {
      break;
    }
  }
  file0.close();
}
// For updating file on spiffs
void updatefile() {
  if (editbs == "0") {
    File datei0 = SPIFFS.open("/LED0.txt", FILE_WRITE);
    if (datei0.println(lastsbd0) + "\r") {
      Serial.println("File was written");;
    } else {
      Serial.println("File write failed");
    }
    datei0.close();

    File datei0a = SPIFFS.open("/LED0.txt", FILE_APPEND);
    if (datei0a.println(lastdguv0) + "\r") {
      Serial.println("File content was appended");
    } else {
      Serial.println("File append failed");
    }
    datei0a.close();

    File datei0b = SPIFFS.open("/LED0.txt", FILE_APPEND);
    if (datei0b.println(ticket0) + "\r") {
      Serial.println("File content was appended");
    } else {
      Serial.println("File append failed");
    }
    datei0b.close();

    File datei0c = SPIFFS.open("/LED0.txt", FILE_APPEND);
    if (datei0c.println(bemerkung0)) {
      Serial.println("File content was appended");
    } else {
      Serial.println("File append failed");
    }
    datei0c.close();
  }
}

println() fügt automatisch "\r\n" für Sie hinzu
Verwenden Sie einfach print(), wenn Sie dies nicht möchten

Dieser Code hat keine Bedeutung
if (datei0a.println(lastdguv0) + "\r")
println() gibt die Anzahl der Bytes zurück, die geschrieben wurden und Sie fügen einen Pointer hinzu...

Danke, die Zeilen mit println() habe ich schonmal mit print() ersetzt.

if (datei0a.print(lastdguv0) + "\r") 

Das verstehe ich leider nicht so ganz. Wie kann ich denn meinen String und das \r in meine Datei schreiben?

Sie können dies tun:

datei0b.print(ticket0);
datei0b.write('\r');
1 Like

Scheint nicht zu funktionieren, crasht wieder.

// For updating file on spiffs
void updatefile() {
  if (editbs == "0") {
    File datei0 = SPIFFS.open("/LED0.txt", FILE_WRITE);
    datei0.print(lastsbd0);
    datei0.write('\r');
    datei0.close();

    File datei0a = SPIFFS.open("/LED0.txt", FILE_APPEND);
    datei0a.print(lastdguv0);
    datei0a.write('\r');
    datei0a.print(ticket0);
    datei0a.write('\r');
    datei0a.print(bemerkung0);

    datei0a.close();
  }
}

Ich erwarte folgendes in der Textdatei:
image

Warum sehe ich diese Prüfung bei dir nicht?

Für was ist es denn notwendig zu prüfen ob die Datei geöffnet wurde?

Wäre ja im Grunde:

if (!datei0) {
    Serial.println("file open failed");
    return;
     }

Vielleicht, damit dein Programm nicht im Fehlerfall mit "Guru Meditation Error: Core 1 panic'ed" abschmiert.
Natürlich könntest du auch die Exception fangen.

Ist abgeändert.

// For updating file on spiffs
void updatefile() {
  if (editbs == "0") {
    File datei0 = SPIFFS.open("/LED0.txt", FILE_WRITE);
    if (!datei0) {
      Serial.println("file open failed");
      return;
    }
    datei0.print(lastsbd0);
    datei0.write('\r');
    datei0.close();

    File datei0a = SPIFFS.open("/LED0.txt", FILE_APPEND);
    if (!datei0a) {
      Serial.println("file open failed");
      return;
    }
    datei0a.print(lastdguv0);
    datei0a.write('\r');
    datei0a.print(ticket0);
    datei0a.write('\r');
    datei0a.print(bemerkung0);

    datei0a.close();
  }
}
void readfiles() {
  char buffer[64];
  int i = 0;

  // 0
  File file0 = SPIFFS.open("/LED0.txt", "r");
  if (!file0) {
    Serial.println("file open failed");
    return;
  }
  while (file0.available()) {
    int l = file0.readBytesUntil('\r', buffer, sizeof(buffer));
    buffer[l] = 0;
    if (i == 0) {
      lastsbd0 = buffer;
    }
    if (i == 1) {
      lastdguv0 = buffer;
    }
    if (i == 2) {
      ticket0 = buffer;
    }
    if (i == 3) {
      bemerkung0 = buffer;
    }
    i++;
    if (i == 4) {
      break;
    }
  }
  file0.close();

Stürzt trotz Überprüfung direkt ab.

Sie Vermissen einer
datei0a.write('\r');

Habe ich hinzugefügt, keine Verbesserung.

Schon mal versucht, die Fehlermeldung aufmerksam zu lesen?
Und auch den ExceptionDecoder zum Einsatz zu bringen?

Denn eigentlich sagt dir der ESP schon, was ihm nicht schmeckt.

Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x40056722  PS      : 0x00060c30  A0      : 0x8005682e  A1      : 0x3ffb1e90  
A2      : 0x3ffb80c0  A3      : 0x00000000  A4      : 0x00000000  A5      : 0x0000000a  
A6      : 0x00000000  A7      : 0x00000008  A8      : 0x8000be99  A9      : 0x3ffb1e80  
A10     : 0x3ffb80c0  A11     : 0x00060c23  A12     : 0x00060c20  A13     : 0x0ccccccc  
A14     : 0x00000000  A15     : 0x00000004  SAR     : 0x0000000c  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xffffffff  

ELF file SHA256: 0000000000000000

Backtrace: 0x40056722:0x3ffb1e90 0x4005682b:0x3ffb1ec0 0x400566cd:0x3ffb1ee0 0x400d197b:0x3ffb1f00 0x400d1c3a:0x3ffb1f40 0x400d27ea:0x3ffb1f60 0x400dcfa6:0x3ffb1fb0 0x40089c66:0x3ffb1fd0

Dekodiert:

Decoding 11 results
0x400d197b: calculatedays() at C:\Users\Daniel\Documents\Arduino\libraries\FastLED\src/controller.h line 171
0x400d1c3a: colorleds() at C:\Users\Daniel\Documents\Arduino\libraries\FastLED\src/controller.h line 171
0x400d27ea: setup() at C:\Users\Daniel\Documents\Arduino\libraries\FastLED\src/controller.h line 171
0x400dcfa6: loopTask(void*) at C:\Users\Daniel\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\cores\esp32/main.cpp line 37
0x40089c66: vPortTaskWrapper at /home/runner/work/esp32-arduino-lib-builder/esp32-arduino-lib-builder/esp-idf/components/freertos/port.c line 355 (discriminator 1)

Ich kann hiermit nicht sonderlich viel anfangen.

Was ist editbs ? (Snippets R Us!)

String editbs;

Ein String, welcher eine Zahl aus einer GET Request speichert.

    // GET editid value on <ESP_IP>/get?editid=<editid>
    if (request->hasParam(editid)) {
      editbs = request->getParam(editid)->value();
    }

    updatefile();

Wenn ich mein Spiffs Dateisystem zurücksetzte, dann stürzt der ESP32 auch nicht ab. Er stürzt ab sobald ich die Datei erzeugt habe und er diese einlesen will.

Versuche dies

#include <SPIFFS.h>

const byte maxLines = 3;
String lineOut[maxLines];
String lineIn[maxLines];

void setup() {
  Serial.begin(112500);
  while (!Serial);

  if (SPIFFS.begin()) {
    Serial.println(F("SPIFFS mounted correctly."));
  } else {
    Serial.println(F("!An error occurred during SPIFFS mounting"));
  }

  // fill up with data
  for (byte i = 0; i < maxLines; i++) {
    lineOut[i] = "Data #";
    lineOut[i] += i;
    lineOut[i] += " = ";
    lineOut[i] += random(0, 101);
  }

  // --- write ----
  File file = SPIFFS.open("/test.txt", "w");
  if (!file) {
    Serial.println("Failed to open test file for writing");
    while (true) yield();
  } else {
    for (byte i = 0; i < maxLines; i++) file.println(lineOut[i]);
    file.close();
  }

  // --- read ----
  file = SPIFFS.open("/test.txt", "r");
  if (!file) {
    Serial.println("Failed to open test file for reading");
    while (true) yield();
  } else {
    for (byte i = 0; i < maxLines; i++)
      if (file.available()) {
        lineIn[i] = file.readStringUntil('\n');
        lineIn[i].trim();
      }
    file.close();
  }

  // show results:
  for (byte i = 0; i < maxLines; i++) {
    Serial.print(lineOut[i]);
    Serial.print("\t->\t");
    Serial.println(lineIn[i]);
  }
}

void loop() {}
SPIFFS mounted correctly.
Data #0 = 28	->	Data #0 = 28
Data #1 = 31	->	Data #1 = 31
Data #2 = 38	->	Data #2 = 38

sieht aus wie es funktioniert :slight_smile:

Hilft nur nicht beim eigentlichen Problem. :sweat_smile:

Verwenden Sie den gleichen Ansatz für Ihr Lesen und Schreiben