INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
13.12.2020, 22:59
Beitrag #1
ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Hallo Community,

ich nutze den ESP32 mit der Arduino IDE und suche eine Lösung um Daten, die ein Nutzer über ein Webinterface absendet, in einer Datei (LittleFS-Dateisystem) zu speichern. Die Daten erhalte ich als JSON-String, der hexadezimale Bytefolgen enthält. Diese können jeden möglichen Wert, also auch Zerobytes enthalten. Die Anzahl Bytes ist vorher unbekannt, kann viele Kilobytes betragen.

Jetzt muss ich diese Daten weiter verarbeiten und byteweise in einer Datei speichern. Und das natürlich binär, um den Overhead an Speicherbedarf durch die hexadezimale Formatierung zu umgehen.

Problem 1:
Wie schreibe ich Zero-Bytes in einen String, um dessen Inhalt dann im Filesystem zu speichern? Angeblich können richtige Strings aus der String-Klasse Zerobytes beinhalten.

Folgendes Beispiel funktioniert nicht:
Code:
char buffer[] = {0x65, 0x66, 0x67, 0x68, 0x00, 0x65, 0x66, 0x00, 0x00, 0xff, 0x00};
String saveStr = String(buffer);
Serial.println(saveStr);
Der String endet beim ersten Nullbyte.

Gibt es eine Notation für Nullbytes in Strings? Ich glaube ich habe sie durch Ausprobieren gefunden. Doch folgendes Beispiel funktioniert auch nicht:
Code:
String saveStr = "ab\00cdefghijklm";
Serial.println(saveStr.substring(4, 6));
Das Beispiel gibt nichts aus und Serial.println(saveStr); gibt wieder nur den Inhalt bis zum ersten Zerobyte aus, also "ab".

Angenommen ich finde hierfür eine Lösung, lässt sich ein solcher String dann überhaupt im LittleFS-Filesystem nach folgendem Schema speichern? Oder weiß jemand eine bessere Lösung? Bin aber aufgrund des Projekts auf LittleFS angewiesen.
Code:
File file = LITTLEFS.open(path, FILE_WRITE);
file.print(saveStr);
file.close();

Bin für jeden Hinweis dankbar.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 10:04
Beitrag #2
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Du darfst nicht den Umweg über einen String gehen, sondern musst die Zeichen einzeln mit write schreiben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 10:33
Beitrag #3
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Strings sind Zeichenketten - also druckbare Daten. So ist das zumindest gedacht.
Was Du hast sind binäre Daten - da verwendet man 'klassische' Arrays. Das Ende der Daten kannst Du ja bei binären Daten ohnehin nur durch die Anzahl der gültigen Daten festlegen und nicht durch ein dediziertes Endezeichen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 12:41 (Dieser Beitrag wurde zuletzt bearbeitet: 14.12.2020 13:02 von ultralex.)
Beitrag #4
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 10:33)MicroBahner schrieb:  da verwendet man 'klassische' Arrays.
Ok, aber kann ich das zur Laufzeit dimensionieren und wieder freigeben? Die Anzahl Bytes hängt an der Stelle ja vom Anwender ab, würde das gerne flexibel halten.

(14.12.2020 10:04)Tommy56 schrieb:  ...musst die Zeichen einzeln mit write schreiben
Jedes Zeichen einzeln? Das dürfte für Flash-Speicher weder performance-technisch, noch in Bezug auf die Lebensdauer/Schreibzyklen gut sein (da physikalisch nur in Blöcken zugegriffen werden kann).

Außerdem werden viele Nullbytes abwechselnd mit anderen Werten enthalten sein, ich kann also auch nicht den Weg gehen dass ich blockweise jeweils bis zum nächsten Nullbyte schreibe. Ich kann natürlich auch ein Array als temporären Buffer verwenden. Aber LittleFS erwartet beim Schreiben ja ein String-Objekt, oder weiß jemand wie ich Byte-Arrays sinnvoll und performant in eine Datei schreibe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 13:23
Beitrag #5
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 12:41)ultralex schrieb:  Ok, aber kann ich das zur Laufzeit dimensionieren und wieder freigeben?
Klar, geht genau so, wie das auch die String-Klasse macht: mit 'new' und 'delete' ( oder malloc and free ). Ich weis aber nicht, wie gut die Speicherverwaltung beim ESP32 ist, und ob da auch mal aufgeräumt wird. Das Problem wäre aber bei 'String' und selber allozieren das gleiche.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 13:35
Beitrag #6
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
Schon mal ein herzliches Dankeschön an eure Hilfe bisher, ich bin wirklich begeistert!

Offener Punkt wäre also zusammengefasst:
Wie kann ich mit LittleFS Arrays sinnvoll und performant in eine Datei schreiben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 13:44
Beitrag #7
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 12:41)ultralex schrieb:  Jedes Zeichen einzeln? Das dürfte für Flash-Speicher weder performance-technisch, noch in Bezug auf die Lebensdauer/Schreibzyklen gut sein (da physikalisch nur in Blöcken zugegriffen werden kann).
Ob Du 5 einzelne Zeichen schreibst oder 5 Zeichen auf einmal, ist dem Flash völlig egal, da sowieso erst geschrieben wird, wenn der Sektorpuffer (512 Bytes) voll ist oder mit flush bzw. close ein Schreiben erzwungen wird.

Was meinst Du, was intern das Schreiben des Strings macht? Richtig, es schreibt einzelne Zeichen.

Du kannst narürlich auch einen Puffer füllen und den dann schreiben. Ich hatte Dich ja schon auf write hingewiesen. write gibt es nicht nur für Einzelzeichen, sondern auch für Bytearrays mit Übergabe der Länge (write(puffer,länge)).

@Microbahner: Wer sollte da aufräumen?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.12.2020, 14:31 (Dieser Beitrag wurde zuletzt bearbeitet: 14.12.2020 14:34 von MicroBahner.)
Beitrag #8
RE: ESP32: Binärdaten mit LittleFS speichern / Zerobytes in Strings
(14.12.2020 13:44)Tommy56 schrieb:  @Microbahner: Wer sollte da aufräumen?
Vermutlich niemand Wink . Da wird sich der RAM-Speicher mit der Zeit dann wohl auch fragmentieren, wenn man fleißig new und delete nutzt. Aber der ESP32 hat ja einiges davon.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32 D1mini: Schiebeschalter für was? AnFi 2 176 16.01.2021 09:16
Letzter Beitrag: AnFi
  ESP32 Board und LCDKeypadShield kjoussen 23 714 11.01.2021 00:04
Letzter Beitrag: kjoussen
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 13 887 10.01.2021 14:18
Letzter Beitrag: nbk83
Question ESP32 als BLE client, int to 2byte Wert reisner 3 202 07.01.2021 18:13
Letzter Beitrag: Tommy56
  Bester Weg um Sensordaten zu speichern und auszuwerten basementmedia 42 1.236 06.01.2021 23:45
Letzter Beitrag: Tommy56
  ESP32 über OTA luemar 58 2.071 03.01.2021 13:50
Letzter Beitrag: luemar
  Woher Gehäuse für ESP32 ? Steinspiel 36 2.091 28.12.2020 00:43
Letzter Beitrag: Steinspiel
Smile Frage zu Millis im Loop - ESP32 Stargazer 5 693 27.12.2020 06:41
Letzter Beitrag: N1d45
  ESP32 Devkit c4 Oled und RFID RC522 betreiben klappt nicht steffus 1 293 23.12.2020 12:45
Letzter Beitrag: hotsystems
  Vergleich ESP32-Boards (auch Batteriemodus) biologist 0 314 22.12.2020 14:40
Letzter Beitrag: biologist

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste