juergen01:
aber nach receiveBuffer() bekomme Ich in zeile[1] bis zeile[7] nur ein zeichen
Ja, "zeile[index]" ist immer genau ein Zeichen und "zeile" ist ein Zeiger (Char-Pointer) auf eine gesamte Zeile.
juergen01:
zeile=receiveBuffer(); wenn ich das so eingebe bekomme Ich
was not declared in this scope
dann habe meine deklaration
char* zeile;
Ja, jede Variable muss VOR der ersten Verwendung deklariert werden.
Wobei es freigestellt ist, die Variable getrennt zu deklarieren und dann zu verwenden:
char* zeile; // Deklaration
zeile=receiveBuffer(); // Verwendung im Programm
Oder beides in einem Einzeiler zu machen:
char* zeile=receiveBuffer(); // Deklaration und Verwendung im Programm
juergen01:
Dann noch kann man die einzelnen Werte immer an der gleichen stelle im Char-Array einlesen
Du kannst alles mögliche machen.
Je nachdem, wie Du es brauchst.
Wenn Du aus dem Char-Array beispielsweise Gleitkommazahlen herausziehen und an "float" Variablen zuweisen wolltest, würdest Du beispielsweise den Char-Pointer auf den Anfang der gewünschten Zahl im Char-Array zeigen lassen und die Library-Funktion "atof" (steht für "Array to float") aufrufen. Z.B.
float f=atof(zeile); // Deklariere Gleitkommazahl f und weise die Zahl zu, die ab Anfang von "zeile" im Char-Array steht.
Wichtig ist dabei immer die Prüfung darauf, ob "zeile" überhaupt gültig ist. Ich verwende nur zwei Zuweisungen für "zeile", die Variable ist entweder "NULL", und das bedeutet, es wurde über die serielle Schnittstelle noch keine gültige Zeile mit allen Werten empfangen. Oder "zeile" ist ungleich NULL, was bedeutet, dass dieser Char-Pointer auf das in der Funktion receiveBuffer() deklarierte Char-Array zeigt.
In der loop-Funktion hast Du also zwei Möglichkeiten, die Prüfung zu machen und die loop am Laufen zu halten.
- Möglichkeit: Prüfen auf NULL und wenn NULL, dann die loop abbrechen und neu starten, indem die loop-Funktion vorzeitig mit "return" verlassen wird.
void loop()
{
char* zeile=receiveBuffer();
if (zeile==NULL) return; // loop vorzeitig verlassen (loop wird direkt danach automatisch neu aufgerufen)
// Der nachfolgende Code wird nur ausgeführt, wenn etwas anderes als NULL zurückgeliefert wurde
// Den auszuführenden Code zur Behandlung von "zeile" hier einfügen
}
Oder Du machst einen Codeblock, der nur ausgeführt wird, wenn ein Pointer ungleich NULL ("!NULL") zurückgeliefert wurde:
void loop()
{
char* zeile=receiveBuffer();
if (zeile!=NULL) // es wurde gerade eine Zeile vollständig empfangen
{
// Den auszuführenden Code zur Behandlung von "zeile" hier einfügen
}
// weiteren in der loop auszuführenden Code hier einfügen
}
Was soll denn nun insgesamt mit der Zeile genau gemacht werden, nachdem sie empfangen wurde?