Ik ben erg nieuw in Arduino Programming. Ik probeer de invoerstring van de seriële monitor te identificeren en de uitvoer dienovereenkomstig naar de console af te drukken
Code is:
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"); } } }
Telkens wanneer ik put send string het toont “onbekend” als de uitvoer, wat fout is, en ik zou “geïdentificeerd” moeten worden als de uitvoer. Kan iemand me hier begeleiden om het resultaat te bereiken.
Opmerking: ik krijg uitvoer zoals ik wilde door de functie readStringUntil te gebruiken, maar de strings hebben veel “.” erin, dus niet bruikbaar.
Opmerkingen
Answer
Als u instelt de regel van uw Serial Monitor die eindigt op “Both NL & CR”, dan zal deze code het woord “send” vinden. Het zal NIET het woord “send” in deze string vinden, “ssend” of in deze string, “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"); } } }
Als je de string “send” wilt vinden in “1234send” of “send1234” of “1234send5678” gebruik dan 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"); } } }
Antwoord
Er zijn een aantal redenen waarom de * .equals-test onwaar is. Houd rekening met het verschil tussen hoofdletters en kleine letters of extra tekens die zijn ingevoerd vanuit de bron van uw communicatie. Zelfs niet-afdrukbare tekens kunnen een probleem vormen en ervoor zorgen dat de test mislukt.
Overweeg om * .substring () . Deze methode retourneert true als de subtekenreeks wordt gevonden. Bijvoorbeeld:
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"); }
… moet altijd retourneer “geïdentificeerd” omdat de karakters “s”, “e”, “n” en “d” in de juiste volgorde binnen de string stringOne voorkomen.
Opmerkingen
- String str = Serial.readString (); if (str.substring (0) == " send ") Serial.println (" geïdentificeerd "); anders Serial.println (" onbekend "); dit werkte niet eens.
- Vreemd. Heb je de pagina met links naar de webpagina bekeken om er zeker van te zijn dat je de substring correct gebruikte? ( Deze webpagina? ). Ik zie ook aan de hand van de opmerkingen dat je de ontvangen string hebt afgedrukt en dat je " send " zag in het ontvangen bericht, correct? Misschien wilt u gewoon commentaar geven op de seriële leesregel en proberen " String str = " 12345 send 1234 "; " om te testen of alles werkt. Te oordelen naar andere opmerkingen, kunt u snel proberen " spatie " + " stuur " + " spatie " (" stuur ") om te zien of dat werkt.
- Dat heeft ' niet gewerkt. substring (n) geeft alleen het gedeelte van de string terug dat begint op positie n. Dus substring (0) retourneert alleen een kopie van de string. str.substring (0,4) retourneert de eerste 4 tekens van de tekenreeks (aangenomen dat er ten minste 4 tekens zijn om terug te geven – ik ' ben niet bekend genoeg met deze implementatie om te weten wat dat doet het voor een kortere string – C # zou een uitzondering opleveren).
Answer
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"); } } }
Reacties
- Lezen van de string " send " het gebruik van Serial.readString () commando is prima. Maar op de een of andere manier zal het niet werken als je het resultaat gebruikt om te vergelijken (bijv. Data == " send " …). Een mogelijke oplossing is om character array te gebruiken (bijvoorbeeld inChar [5]). De grootte van de array is 1 meer dan het maximale aantal benodigde tekens.
\r\n
niet/r/n
…