wenn ich den String Startaaa999 über die Serielle Schnittstelle an den Arduino Nano schicke, bekomme ich drei Zeilen im seriellen Monitor zurück:
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
}
void serialEvent() {
Serial.println("serialEvent");
String serValue = Serial.readStringUntil('*');
while (Serial.read() >= 0) ;
evalSerValue(serValue);
}
bool evalSerValue(String serValue){
Serial.println(serValue);
}
Ich dachte eigentlich, das String serValue = Serial.readStringUntil('*') bis zum ersten * liest und die Zeile while (Serial.read() >= 0) ; danach den Eingangspuffer löscht - somit die anderen Zeichen im Buffer nicht mehr verarbeitet werden. Ich bekomme aber alle Zeichen zurück. Wieso?
Serial ist langsam! Bei 9600 Baud dauert ein Zeichen ca. 1ms! readStringUntil() ist blockierend und wartet bis das alles da ist. Aber danach ist der Rest noch unterwegs.
Generell ist es besser man arbeitet mit C Strings (d.h. Null-terminierte char Arrays). Dann liest man immer wenn ein Zeichen da ist ein und schreibt das Zeichen in das Array. Das machst man solange bis ein Endzeichen kommt (z.B. CR oder LF, aber es gehen auch andere Zeichen). Danach terminiert man den String und bearbeitet ihn in einer Parse-Funktion.
OK, bei dem char Array in dem ich die Zeichen sammel muss ich ja eine Größe vorgeben. Würde man hier bei der seriellen Schnittstelle die max Buffergröße nehmen (ist glaube ich 64 Byte).
Ich hab jetzt erstmal einen String genommen und mit concat(char) das eingelesen Byte an den String angehängt. Was spricht für das char Array bzw. was gegen einen String?
Würde man hier bei der seriellen Schnittstelle die max Buffergröße nehmen
Es geht auch mehr oder weniger. Je nachdem was man an Daten auf einmal erwartet. Je nach Anwendungen reichen da auch mal 20-30 Bytes.
Die String Klasse ist totaler Müll. Sie ist anfangs einfach zu verwenden, aber das erkauft man sich extrem teuer. Sie verwendet dynamischen Speicher und das nicht besonders intelligent. Anfängern ist nicht klar was da mit dem Speicher überhaupt gemacht wird und sie wissen daher nicht wie wichtig die reserve() Funktion ist. Ohne die wird nach jedem einzelnen neuen char erst mal mit realloc() das interne Array vergrößert.
Das macht das ganze elendig langsam.
Außerdem kann man mit der String Klasse generell recht wenig machen. Die Standard C Funktionen (+GNU Erweiterungen) zur String Behandlung und Konvertierung sind wesentlich umfangreicher.