• Keine Ergebnisse gefunden

Zeichen (Character-) Funktionen

Im Dokument ARDUINO Befehlsübersicht (Seite 80-90)

Im folgenden Kapitel geht es um Zeichen-Funktionen. Als „Zeichen“ werden hier alle eingehenden Zeichen genannt, welche z.B. über die serielle Schnittstelle empfangen werden können. Zeichen sind dabei nicht nur Buchstaben, sondern auch Ziffern, Sonderzeichen und Steuerzeichen. In gewissen Situationen kann es erforderlich sein, zu erkennen, ob eingegangene Zeichen zum Beispiel ein

Sonderzeichen enthalten, oder ein ganz bestimmtes Zeichen. Oder auch, ob das Zeichen eine Ziffer oder ein Buchstabe ist oder ein Steuerzeichen. Genau das können die folgenden Funktionen für uns erledigen.

isAlphaNumeric(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen entweder ein Buchstabe ist oder eine Ziffer.

Syntax

ergebnis = isAlphaNumeric(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isAlphaNumeric(thisChar);

Serial.print("Zeichen ist Buchstabe/Ziffer (1) oder nicht (0): ");

Serial.println(ergebnis);

isAlpha(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein Buchstabe ist.

Syntax

ergebnis = isAlpha(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isAlpha(thisChar);

Serial.print("Zeichen ist Buchstabe (1) oder nicht (0): ");

Serial.println(ergebnis);

81

isAscii(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein ASCII-Zeichen ist

Syntax

ergebnis = isAscii(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isAscii(thisChar);

Serial.print("Zeichen ist ASCII-Zeichen (1) oder nicht (0): ");

Serial.println(ergebnis);

isWhiteSpace(thisChar)

Beispiel-Sketch verfügbar: ASCII_Zeichen_Funktionen.ino

Beschreibung

Stellt fest, ob ein Zeichen eine Leerstelle ist.

Eine Leerstelle kann immer auch ein Leerzeichen sein. Als Leerstelle werden die Steuerzeichen

LINEFEED (10, DEC), Ver.TAB (11, DEC), FORMFEED (12, DEC), CARRIGERETURN (13, DEC) und als Leerzeichen Hor.TAB (9, DEC) und SPACE (32, DEC) gekennzeichnet.

HINWEIS: Aktuell stimmt die originale ARDUINO-Referenz nicht mit der Software (1.8.5) überein. Die Funktionen isSpace() und isWhitespace() geben die Werte vertauscht wieder.

Zur Prüfung dieses Verhalten ist der Sketch ASCII_Zeichen_Funktionen.ino im Download verfügbar!

Syntax

ergebnis = isWhiteSpace(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isWhiteSpace(thisChar);

Serial.print("Zeichen ist Leerstelle (1) oder nicht (0): ");

Serial.println(ergebnis);

isControl(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein Steuerzeichen ist. Steuerzeichen sind nichtdruckbare Zeichen, wie z.B.

Linefeed (Zeilenvorschub), Neue Zeile (CarriageReturn), Formfeed (Seitenvorschub) etc. Siehe hierzu z.B. Wikipedia.

Syntax

ergebnis = isControl(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isControl(thisChar);

Serial.print("Zeichen ist Steuerzeichen (1) oder nicht (0): ");

Serial.println(ergebnis);

isDigit(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen eine Ziffer ist

Syntax

ergebnis = isControl(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isDigit(thisChar);

Serial.print("Zeichen ist eine Ziffer (1) oder nicht (0): ");

Serial.println(ergebnis);

83

isGraph(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein sichtbares Zeichen ist. Ein Leerzeichen (SPACE, Leertaste) ist ein nicht sichtbares Zeichen, eine Prüfung mit isGraph(thisChar) würde als Ergebnis ein „false“ ergeben.

Syntax

ergebnis = isGraph(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isGraph(thisChar);

Serial.print("Zeichen ist ein druckbares Zeichen (1) oder nicht (0): ");

Serial.println(ergebnis);

isLowerCase(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein klein geschriebenes Zeichen (Buchstabe) ist.

Syntax

ergebnis = isLowerCase(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isLowerCase(thisChar);

Serial.print("Zeichen ist ein klein geschriebenes Zeichen (1) oder nicht (0): ");

Serial.println(ergebnis);

isPrintable(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein druckbares Zeichen ist. Das Leerzeichen (Space-Taste) ist ein druckbares Zeichen, welches aber nicht sichtbar ist. Eine Prüfung mit isPrintable(thisChar) führt als Ergebnis zu einem „true“.

Im Unterschied dazu würde eine Prüfung mit isGraph(thisChar) zu einem „false“ führen, da das Leerzeichen nicht sichtbar ist.

Syntax

ergebnis = isPrintable(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isPrintable(thisChar);

Serial.print("Zeichen ist druckbar (1) oder nicht (0): ");

Serial.println(ergebnis);

isPunct(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen eine Interpunktion ist. Interpunktionen sind Satzzeichen wie z.B. Punkt, Doppelpunkt, Ausrufezeichen, Fragezeichen, Komma etc.

Syntax

ergebnis = isPunct(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isPunct(thisChar);

Serial.print("Zeichen ist Interpunktion (1) oder nicht (0): ");

Serial.println(ergebnis);

85

isSpace(thisChar)

Beispiel-Sketch verfügbar: ASCII_Zeichen_Funktionen.ino

Beschreibung

Stellt fest, ob ein Zeichen ein Leerzeichen ist.

Als Leerzeichen werden Hor.TAB (9, DEC) und SPACE (32, DEC) bezeichnet.

Als Leerstelle dagegen die Steuerzeichen LINEFEED (10, DEC), Ver.TAB (11, DEC), FORMFEED (12, DEC), CARRIGERETURN (13, DEC).

Eine Leerstelle kann immer auch ein Leerzeichen sein. HINWEIS: Aktuell stimmt die originale ARDUINO-Referenz nicht mit der Software (1.8.5) überein. Die Funktionen isSpace() und isWhitespace() geben die Werte vertauscht wieder.

Zur Prüfung dieses Verhalten ist der Sketch ASCII_Zeichen_Funktionen.ino im Download verfügbar!

Syntax

ergebnis = isSpace(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isSpace(thisChar);

Serial.print("Zeichen ist Leerzeichen (1) oder nicht (0): ");

Serial.println(ergebnis);

isUpperCase(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen ein groß geschriebenes Zeichen (Buchstabe) ist.

Syntax

ergebnis = isUpperCase(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isUpperCase(thisChar);

Serial.print("Zeichen ist groß geschrieben (1) oder nicht (0): ");

Serial.println(ergebnis);

isHexadecimalDigit(thisChar)

Beschreibung

Stellt fest, ob ein Zeichen eine gültige, hexadezimale Zahl ist.

Syntax

ergebnis = isHexadecimalDigit(thisChar)

Parameter

thisChar Das Zeichen, welches analysiert werden soll ergebnis Wert der Prüfung, boolean (true / false)

Rückgabewert

true (wahr; 1) oder false (nicht wahr; 0)

Beispiel

ergebnis = isHexadecimalDigit(thisChar);

Serial.print("Zeichen ist hexadezimal (1) oder nicht (0): ");

Serial.println(ergebnis);

87

Hilfsfunktionen

sizeof

Beschreibung

Der sizeof Operator ermittelt die Anzahl Bytes in einem Variablentyp, oder die Anzahl von Bytes, welche durch ein Array belegt werden.

Syntax

sizeof(variable)

Parameter

Variable: jeder Variablentype oder Array (z.B. int, float, byte)

Beispiel

Der sizeof-Operator ist nützlich, wenn man mit Arrays arbeitet (wie z.B. Strings) wo es komfortabel ist, die Größe des Arrays zu ändern, ohne andere Teile des Programms zu zerstören oder zu unterbrechen.

Das folgende Programm druckt einen Textstring, immer einen Buchstaben einzeln. Versuchen sie, die Textphrase zu verändern…

char myStr[] = "this is a test";

int i;

void setup(){

Serial.begin(9600);

}

void loop() {

for (i = 0; i < sizeof(myStr) - 1; i++){

Serial.print(i, DEC);

Serial.print(" = ");

Serial.write(myStr[i]);

Serial.println();

}

delay(5000); // slow down the program }

PROGMEM

Beschreibung

Dieses Schlüsselwort sorgt dafür, dass Daten im Flash des ARDUINO anstatt im SRAM abgespeichert werden. Wie wir wissen, ist der SRAM begrenzt: bei ATMega328-basierten Boards, wie dem Uno, Nano, Micro sind das 2kB. Der Flash (dort wo auch das Programm gespeichert wird) hat bei diesen ARDUINOs 32kB.

Durch die Benutzung von PROGMEM kann man also SRAM sparen, wenn dieser im Programm knapp wird. Die PROGMEM-Funktion ist mittlerweile in der IDE implementiert.

PROGMEM modifiziert eine Variable und funktioniert mit den meisten Datentypen, die beim ARDUINO verwendet werden. Nutzer haben aber herausgefunden, das aufgrund der Version des GCC-Compilers manche Anwendungen des PROGMEM-Keywords funktioniert haben, andere wiederum nicht.

Syntax

const dataType variableName[] PROGMEM = {data0, data1, data3...};

Parameter

datatype: Wert beliebiger Datentyp variableName: der Name des Datenarrays

Hinweis

Aufgrund der o.g. möglichen Unterschiede, je nach Compiler-Version, können unterschiedliche Schreibweisen funktionieren. Die folgenden funktionieren:

const dataType variableName[] PROGMEM = {}; // so geht’s const PROGMEM dataType variableName[] = {}; // oder so const dataType PROGMEM variableName[] = {}; // aber NICHT so

Auch, wenn es theoretisch möglich ist, diese Schreibweise für nur eine einzige Variable zu benutzen, macht es wirklich nur Sinn bei großen Datenmengen, welche in Arrays gespeichert werden müssen. Ich persönlich habe es noch nie benutzt, nur einmal, um es zu testen. Ich denke, für Anfänger ist es einfach zu kompliziert…

Die Benutzung von PROGMEM ist etwas umständlich und auch eine zweistufige Arbeitsweise. Nachdem die Daten mit der Funktion in den Flash gelangt sind, müssen sie zur Benutzung auch dort wieder heraus in den SRAM geholt werden.

Beispiel

// save some unsigned ints

const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};

// save some chars

const char signMessage[] PROGMEM = {"I AM PREDATOR, UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;

displayInt = pgm_read_word_near(charSet + k);

Serial.println(displayInt);

}

Serial.println();

// read back a char

int len = strlen_P(signMessage);

for (k = 0; k < len; k++) {

myChar = pgm_read_byte_near(signMessage + k);

Serial.print(myChar);

}

Serial.println();

}

89 void loop() {

// put your main code here, to run repeatedly:

}

Es ist zu beachten, dass die Variablen, welche mit PROGMEM benutzt werden sollen, global definiert werden müssen. Oder aber mit dem Keyword static, damit sie mit PROGMEM arbeiten.

Der folgende Ausdruck wird innerhalb einer Funktion nicht gehen:

const char long_str[] PROGMEM = "Hi, I would like to tell you a bit about myself.\n";

Dieser hier geht, auch wenn man ihn lokal in einer Funktion definiert:

const static char long_str[] PROGMEM = "Hi, I would like to tell you a bit about myself.\n"

F()-Makro

In diesem Zusammenhang sei auch noch auf das F()-Makro verwiesen. Man kann es benutzen, wenn viele Text-Ausgaben auf den seriellen Monitor erfolgen. Damit kann man sehr schnell den SRAM füllen und hat nicht mehr genügend für den Rest des Programms. Vermeiden lässt sich das mit der folgenden Schreibweise:

Serial.print(F("Etwas auf dem Serial Monitor anzeigen…"));

Siehe hierzu auch „RAM sparen bei Serial.print“ im Abschnitt „Kleine hilfreiche Programm-Teile“

Im Dokument ARDUINO Befehlsübersicht (Seite 80-90)