Motivation

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.

In­halts­ver­zeich­nis

Bibliothek UrsStringStream

Verwendung

Beispiele

Implementierung

Download


Bibliothek UrsStringStream

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.

Verwendung

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!

Beispiel

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:

Output des Beispiels zu UrsStringStream

Implementierung

// 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.

Download

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