In­halts­ver­zeich­nis

1. Dokumentation

2. Erweiterung zum Ausgabe von 64-Bit Zahlen


Klasse Print

Stream HardwareSerial

Print ist eine abstrakte Klasse, kann also selbst nicht instanziiert werden, stellt aber Methoden zur Verfügung, die die Ausgabe von einer Reihe von Objekt­Typen erleichtern. Die diversen print()- und println()-Methoden der Klasse Print erzeugen einen Text, der für das übergebene Objekt ausgegeben werden soll, und übergeben diesen Text zeichenweise an die Methode write(). write() selbst ist in Print nicht implementiert (abstrakte Methode), sondern muss in einer konkreten Klasse, die für die Ausgabe über eine vorhandene Hardware-Einheit zuständig ist, für diese Hardware passend zugeschnitten sein.

Weiterhin steht mit setWriteError(), getWriteError() und clearWriteError() ein Methodensatz zur Fehlermeldung zur Verfügung.

Methoden
virtual size_t write (uint8_t a) = 0 Gibt ein einzelnes Zeichen über die Hardware aus. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Diese Funktion muss von einer auf die Hardware zugeschnitten Klasse überschrieben werden.
virtual size_t write (const uint8_t *buffer, size_t size) Gibt ein Byte-Array aus. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. In der Implementierung dieser Methode in Print wird der Puffer zeichenweise an write(uint8_t) übergeben. Dies ist ineffizient bei gepufferten Ausgabeeinheiten und sollte in diesen Fällen überschrieben werden.
size_t write (const char *str) Gibt einen C-String aus. Das abschließende '\0' wird nicht mit ausgegeben. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Die Stringlänge wird über strlen ermitteln und dann an write (const uint8_t *buffer, size_t size) weitergeleitet.
size_t print (char c) Gibt ein einzelnes Zeichen aus. Der Rückgabewert ist Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen.  
size_t print (const char str[]) Gibt einen C-String aus. Das abschließende '\0' wird nicht mit ausgegeben. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Wird direkt an write (const char *str) weiter gegegeben.
size_t print (const String &s) Ausgabe eines Objekts der Klasse String. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen.  
size_t print (unsigned char n, int base = DEC) Ausgabe einer Ganzzahl. Die Basis ist auf Dezimal voreingestellt. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Arduino stellt für die Basisangabe die Konstanten BIN, OCT, DEC und HEX zur Verfügung.  Als Basis ist im Prinzip jede positive Ganzzahl > 1 möglich. Die Angabe einer Basis < 2 kann zu merkwürdigem Verhalten führen. Im besten Fall wird einfach als Basis 10 genommen.
size_t print (int n, int base = DEC) s.o.  
size_t print (unsigned int , int base = DEC) s.o.
size_t print (long n, int base = DEC) s.o.
size_t print (unsigned long n, int base = DEC) s.o.  
size_t print (double , int digits = 2) Ausgabe einer Fließkommazahl. Die Anzahl der Dezimalstellen ist auf 2 voreingestellt. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Neben den regulären Zahlen kann das IEEE-754-Gleitkommazahlenformat nicht darstellbare Zahlen verwalten. Dies sind nan (Not a Number, z.B. bei sqrt(-1)) und inf (Infinity, z.B. bei 1 / 0). Diese werden als "nan" und "inf" ausgegeben. Überschreitet der Zahlenwert ±4294967040.0 wird "ovf" ausgegeben.
size_t print (const Printable &) Ausgabe eines Objekts einer Klasse die von Printable abgeleitet ist.  Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Die Rückgabewert wird von der konkreten Methode der Klasse festgelegt.

size_t

print (const __FlashStringHelper *) Ausgabe einer Zeichenkette, die unter Benutzung des Makros F() im Flash abgelegt wird. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Serial.print(F("Hallo"));

"Hallo" wird im Flash abgelegt.
size_t println (void) Ausgabe eines Zeilenvorschubs. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Es wird '\r\n' ausgegeben.
size_t println (...) Wie die entsprechende print-Methode mit anschließendem Zeilenvorschub. Der Rückgabewert ist die Anzahl der ausgegebenen Zeichen. Es wird print(...) aufgerufen und danach println().

protected void 

setWriteError (int err=1) Ermöglicht einer Klasse, die Print implementiert, einen Fehlercode zu setzen.  

int  

getWriteError () Liefert den letzten Fehlercode der bei einer Schreiboperation aufgetreten ist. Die Fehlercodes werden durch die konkrete Klasse festgelegt, die Print implementiert.
void clearWriteError () Löscht den Fehlercode.  

Siehe auch:
Klasse Printable
Klasse Stream
:: How to Use the Print Class ::
Arduino-Anatomie: How to Print!?


Erweiterung zur Ausgabe von 64-Bit Zahlen

Leider besitzt Print keine Methoden zur Ausgabe von 64-Bit-Zahlen (int64_t, uint64_t, long long, ...). Dies lässt sich aber einfach nachrüsten.

Anpassung von Print.h

In Print.h müssen Prototypen für die neuen Methoden hinterlegt werden:

...
size_t println(void); // <- Letzte Zeile im Original

// Support für 64-Bit Zahlen hinzugefügt (30.1.2016)
size_t println(int64_t, uint8_t = DEC);
size_t print(int64_t, uint8_t = DEC);
size_t println(uint64_t, uint8_t = DEC);
size_t print(uint64_t, uint8_t = DEC);

Anpassung von Print.cpp

In Print.cpp müssen die Methoden definiert werden. Der folgende Code wird einfach hinten angefügt.

// Support für 64-Bit Zahlen hinzugefügt (30.1.2016)
size_t ICACHE_FLASH_ATTR Print::println(int64_t number, uint8_t base)
{ size_t n = 0;
  n += print(number, base);
  n += println();
  return n;
}

size_t ICACHE_FLASH_ATTR Print::print(int64_t number, uint8_t base)
{ size_t n = 0;
 if (number < 0)
 { write('-');
   number = -number;
   n++;
 }
 n += print((uint64_t)number, base);
 return n;
}

size_t ICACHE_FLASH_ATTR Print::println(uint64_t number, uint8_t base)
{ size_t n = 0;
  n += print((uint64_t)number, base);
  n += println();
  return n;
}

size_t ICACHE_FLASH_ATTR Print::print(uint64_t number, uint8_t base)
{ size_t n = 0;
  unsigned char buf[64];
  uint8_t i = 0;

  if (number == 0)
  { n += print((char)'0');
    return n;
  }
 
   if (base < 2) base = 2;
 else if (base > 16) base = 16;

  while (number > 0)
  {  uint64_t q = number/base;
    buf[i++] = number - q*base;
    number = q;
  }
 
  for (; i > 0; i--)
    n += write((char) (buf[i - 1] < 10 ?
      '0' + buf[i - 1] :
      'A' + buf[i - 1] - 10));
   
   return n;
}

Das Attribut ICACHE_FLASH_ATTR sind für den ESP8266 und kann in der Standard-Arduino-Version entfallen.