Sehr einfache Arduino Uno Serial.readString () -Operation

Ich bin sehr neu in der Arduino-Programmierung. Ich versuche, die Eingabezeichenfolge vom seriellen Monitor zu identifizieren und die Ausgabe entsprechend an die Konsole zu drucken.

Der Code lautet:

void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

Wann immer i put send string es zeigt „unbekannt“ als Ausgabe, was falsch ist, und ich sollte als Ausgabe „identifiziert“ werden. Kann mich hier jemand anleiten, um das Ergebnis zu erzielen?

Hinweis: Ich erhalte die Ausgabe wie gewünscht mithilfe der Funktion readStringUntil, aber die Zeichenfolgen enthalten viele „.“ darin nicht nützlich.

Kommentare

  • Wie ist Ihre Einstellung für das Zeilenende in Serial Monitor?
  • sowohl NL als auch CR.
  • dann prüfen, ob " send / r / n "
  • Sie meinen \r\n nicht /r/n
  • Das Problem beim Verlassen auf Dinge wie readString ist, dass Sie wirklich keine ' weiß nicht, was sie tun oder wie sie funktionieren. Analysieren Sie die eingehenden Daten manuell, damit Sie wissen, mit was Sie arbeiten.

Antwort

Wenn Sie festlegen Wenn die Zeile Ihres seriellen Monitors mit „Both NL & CR“ endet, findet dieser Code das Wort „send“. In dieser Zeichenfolge wird das Wort „send“ NICHT gefunden. „ssend“ oder in dieser Zeichenfolge „sendd“.

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Wenn Sie die Zeichenfolge „send“ in „1234send“ oder „send1234“ oder finden möchten „1234send5678“ verwenden Sie dann indexOf ();

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Antwort

Es gibt Eine beliebige Anzahl von Gründen, aus denen der * .equals-Test falsch ist. Berücksichtigen Sie Groß- und Kleinschreibung oder zusätzliche Zeichen, die von der Quelle Ihrer Kommunikation eingegeben wurden. Selbst nicht druckbare Zeichen können ein Problem darstellen und dazu führen, dass der Test fehlschlägt * .substring () stattdessen. Diese Methode gibt true zurück, wenn der Teilstring gefunden wird. Beispiel:

 String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); } 

… sollte immer Geben Sie „identifiziert“ zurück, da die Zeichen „s“, „e“, „n“ und „d“ in der richtigen Reihenfolge innerhalb der Zeichenfolge stringOne gefunden werden.

Kommentare

  • String str = Serial.readString (); if (str.substring (0) == " send ") Serial.println (" identifiziert "); sonst Serial.println (" unbekannt "); Dies hat nicht einmal funktioniert.
  • Ungerade. Haben Sie sich die verlinkte Webseite angesehen, um sicherzustellen, dass Sie die Teilzeichenfolge korrekt verwendet haben? ( Diese Webseite? ). Aus den Kommentaren geht auch hervor, dass Sie die empfangene Zeichenfolge ausgedruckt haben und in der empfangenen Nachricht " " gesendet haben. richtig? Möglicherweise möchten Sie nur die serielle Lesezeile auskommentieren und versuchen, " String str = " 12345 send 1234 ; ", um zu testen, ob alles funktioniert. Nach anderen Kommentaren zu urteilen, könnten Sie schnell versuchen, " Leerzeichen " + " senden Sie " + " Leerzeichen " (" sende "), um zu sehen, ob das funktioniert.
  • Das ' funktioniert nicht. Teilzeichenfolge (n) gibt nur den Teil der Zeichenfolge zurück, der an Position n beginnt. Der Teilstring (0) gibt also nur eine Kopie des Strings zurück. str.substring (0,4) gibt die ersten 4 Zeichen des Strings zurück (vorausgesetzt, es werden mindestens 4 Zeichen zurückgegeben – ich ' bin mit dieser Implementierung nicht vertraut genug, um zu wissen, was Dies gilt für eine kürzere Zeichenfolge (C # würde eine Ausnahme auslösen).

Antwort

void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

Kommentare

  • Lesen des Strings " send " Die Verwendung des Befehls Serial.readString () ist in Ordnung. Aber irgendwie funktioniert es nicht, wenn Sie das Ergebnis zum Vergleichen verwenden (z. B. data == " send " …). Eine mögliche Lösung besteht darin, ein Zeichenarray zu verwenden (z. B. inChar [5]). Die Größe des Arrays beträgt 1 mehr als die maximal erforderlichen Zeichen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.