Emfpangen von Befehlen über Seriellen Monitor

Hallo ihr Lieben,
heute muß ich euch mal wieder ein paar Fragen stellen. In meinem Projekt der Haussteuerung bin ich eigentlich so weit durch und es läuft auch alles wie gewollt. In der Phase kommen einem dann Ideen, was man noch alles machen könnte und so begann ich meine ESP32 Module auch per WiFi mit Anweisungen/Befehlen zu füttern. Auch dieses klappt prima. Der Server und der ESP32 verstehen sich und der ESP führt die Anweisungen nach kurzer Rückfrage, ob das so richtig verstanden wurde, aus.

Nun arbeite ich daran dies auch über den seriellen Monitor der Arduino IDE zu können. Leider treten dabei ein paar Probleme auf.
Problem 1:
Gebe ich im seriellen Monitor "Befehl" ein und drücke Enter, zeigt mir das anhängende Skript 100te male auch "Befehl" an, aber manchmal eben auch nur "efehl". Es fehlt also das erste Zeichen.
In dem kleinen Beispielskript funktioniert das noch recht gut. In meinem großen Skript tritt dieser Fehler recht häufig auf, ich vermute durch die Laufzeit des Skripts.
Problem 2:
Wie man in dem Beispielskript sehen kann, sollte die Ausgabe des Empfangenen Befehls eigentlich so aussehen...
Befehl!
Das "!" setzte ich mutwillig dahinter, weil in der "if" am Schluß nie "Befehl" erkannt wurde. Es mußte also noch was in dem String sein, das die Auswertung auf "true" verhindert und wie man in der Ausgabe im seriellen Monitor dann auch sieht...
Befehl
!
müßte am Ende des Strings noch ein Zeilenumbruch stehen.

Dies beides führt mich nun zu folgen Fragen:
Wie kann ich das empfangen stabiler machen, der ESP soll mich ja schließlich verstehen. Sollte der Fehler mit dem nicht empfangenen Zeichen an Laufzeiten liegen, Eventuell das Empfangen von Befehlen auf einen Interrupt legen? Oder dies über den zweiten Prosessorkern laufen lassen, der noch recht ungenutzt rumlungert? Wenn ja wie? Bisher habe ich sowas noch nicht gemacht.

Die Zweite Frage wäre, wie kann ich dem empfangenen String hinten das letzte Zeichen, also den Zeilenumbruch weg löschen.

Hier das kurze Beispielskript...

void setup() {
  Serial.begin(115200);
  delay(100);
}

void loop() {
  int incomingByte;
  String serialString;
  incomingByte = Serial.read();
  serialString = Serial.readString();
  Serial.print("Seriell empfangen: ");
  Serial.println(incomingByte, DEC);
  Serial.print(serialString);
  Serial.println("!");
  if (serialString=="Befehl"){
    Serial.println("Befehl erkannt");
  }
}

Vielleicht noch als Hinweis, ich setze hier vor einem Mac, da diese ja gern mal einen Unterschied machen im Umgang mit Zeilenumbrüchen. Nur falls es relevant sein sollte. Funktionieren muß es natürlich mit beidem Mac und PC.

Entschuldigt meine Unwissenheit, vermutlich ist das Problem den Zeilenumbruch hinten weg zu löschen ganz einfach, ich komme aber gerade nicht drauf und mir fällt auch gerade nicht mal ein, wonach ich da suchen sollte. (Manchmal kommt man ja auch die einfachsten Sachen nicht)

Liebe Grüße

Susann

Warum liest Du 2 Mal von Serial?
Hier ist ein Beispiel für eine Einleseroutine drin. Nicht mit String, sondern mit Char-Array.

Gruß Tommy

Edit: Link korrigiert

Zum "Empfangen von Befehlen über Seriellen Monitor" verwende ich gerne den CmdMessenger.

Arbeite die

Serial Input Basics

durch, da steht wirklich alles drinnen wie man Daten verlässlich empfangen kann.

Hallo Tammy,
dein Link führt leider zu diesem Tread hier.

Aber es stimmt schon, ich lese zwei mal. Das werde ich mal ändern und probieren. Aber ursprünglich war da eine zusätzliche
if (Serial.available() > 0) -Schleife drin, getreu dem Motto zeige nur an wenn auch Daten gekommen sind und Serial.println(incomingByte, DEC); -zeigte eben nur die Länge des empfangenen an. Ich schaute also nach wie ich das gesendete als String einlesen kann und setzte es einfach mit serialString = Serial.readString();-darunter.

Wobei du dann aber vergessen hast, dass readString einen Timeout hat. Wenn nicht jetzt schon, dann wird es dir später noch auf die Füße fallen.

Das hatte ich schon gelesen, daß dies so ist. Nur geht es hier um das einlesen einzelner Wörter die als Befehl dienen, darum hatte ich dies erst mal außer acht gelassen. Bin ja noch am rumprobieren.

Danke für den Tip, werde ich mich mal mit beschäftigen. Ist das erste mal das ich mich mit serieller Kommunikation auseinander setze und bin noch nicht ganz dahinter gestiegen. Mit dem Motto, dummer wirst du nicht davon, baue ich eben immer wieder mal solche überflüssigen Sachen ein, nur um was zu lernen. Zumal mir C++ nicht wirklich geläufig ist. Leider tue ich mich dann oft auch schwer, weil viele gute Beschreibungen nun mal auf englisch sind, was ich nie gelernt habe. Meist verstehe ich dann die vorgestellten Skripte besser als die Texte dazu :smile: So genug aus dem Nähkästchen geplaudert.

Susann

ehrlicherweise hat das mit C++ wenig zu tun.
Da gehts ums Prinzip wie man etwas empfängt, zusammenstoppelt, erkennt wenns fertig ist, damit was tut.

Ob du das jetzt in basic, c++ oder xyz hinschreibst ist schon egal. Man nimmt halt was man zur Verfügung hat.

Ich habe den Link in #2 korrigiert. Sorry.

Gruß Tommy

Danke Tommy