Nicht immer ist es möglich, Daten in einer Datei abzulegen. Manchmal ist nur die Ablage in einem String möglich. In diesem Fall stehen die komfortablen Funktionen zur Datenbereitstellung der Stream-Klasse nicht zur Verfügung. Im Zweifelsfall muss man doppelten Code schreiben.
Die Klasse UrsStringStream stellt einen Stream mit einem String-Objekt als Datenquelle bereit.
Die Bibliothek besteht nur aus der Klassendefinition von UrsStringStream. Alle Methoden sind als Inline-Methoden in der Header-Datei deklariert, um die Optimierungsoptionen des Compilers eine bestmöglich auszunutzen.
Die Verwendung ist recht einfach. Es wird eine neue Instanz der UrsStringStream-Klasse mit dem Quell-String initialisiert. Anschließen stehen über diese Instanz die üblichen Methoden der Stream-Klasse bereit.
Zusätzlich steht die Methode rewind() bereit, die den internen Positionszeiger wieder auf Anfang stellt.
Wegen der internen Speicherung als Referenz auf einen String (String&), werden Änderungen an dem Inhalt des String auf der Stelle wirksam!
Das folgende Beispiel initialisiert eine Instanz von UrsStringStream mit einem längeren Text, der Zeilenvorschübe enthält. Über die Methode readStringUntil() der Stream-Klasse wird der Text in einzelne Zeilen zerlegt. Diese werden jeweils mit spitzen Klammern versehen und ausgegeben. Statt des Strings hätte genau so gut eine Datei (File) als Datenquelle funktionieren können.
Der Code:
#include <UrsStringStream.h>
String text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor\n"
"invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.At vero eos et accusam\n"
"et justo duo dolores et ea rebum.Stet clita kasd gubergren, no sea takimata sanctus est\n"
"Lorem ipsum dolor sit amet.Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam\n"
"nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.At\n"
"vero eos et accusam et justo duo dolores et ea rebum.Stet clita kasd gubergren, no sea\n"
"takimata sanctus est Lorem ipsum dolor sit amet.";
UrsStringStream USStream(text);
void setup() {
Serial.begin(115200);
Serial.print("\n\n");
Serial.println("UrsStringStream Sample\n");
}
void loop() {
// Zeilenweise einlesen
while (String t = USStream.readStringUntil('\n')) {
if (t.length() == 0) break; // Fertig
String o = ">> " + t + " <<";
Serial.println(o);
}
// Wiederholen bei Dateneingabe
if (Serial.available()) {
USStream.rewind();
while (Serial.available()) {
Serial.read();
}
Serial.flush();
}
delay(10);
}
Der Output:
// UrsStringStream.h
//
// Autor: http://UllisRoboterSeite.de
// Doku: http://ullisroboterseite.de/esp8266-stringstream.html
// Created: 2017-09-04
//
// Version 1.0 (2017-09-04)
// -------------------------
// - Basis-Version
//
#ifndef _URSSTRINGSTREAM_h
#define _URSSTRINGSTREAM_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Stream.h>
class UrsStringStream : public Stream {
// Wegen der internen Speicherung als Referenz auf einen String,
// werden Änderungen an dem Inhalt des String auf der Stelle wirksam.
public:
UrsStringStream(String &s) : string(s), position(0) {}
// Stream methods
virtual int available() { return string.length() - position; }
virtual int read() { return position < string.length() ? string[position++] : -1; }
virtual int peek() { return position < string.length() ? string[position] : -1; }
virtual void flush() {};
// Print methods
virtual size_t write(uint8_t c) { string += (char)c; return 1; };
// Stellt den internen Positionszeiger wieder auf Anfang.
void rewind() { position = 0; }
private:
String &string;
unsigned int position;
};
#endif
Die .cpp-Datei ist leer.
Das ZIP-Archiv für Bibliothek UrsStringStream zum Download. Die entpackten Dateien ins Verzeichnis <user>\Documents\Arduino\libraries kopieren (siehe Installing Additional Arduino Libraries).
Das Archiv enthält die Bibliotheksdateien