Jag är väldigt ny på Arduino-programmering. Jag försöker identifiera ingångssträngen från seriell bildskärm och skriva ut utdata till konsolen i enlighet med detta
Koden är:
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"); } } }
När jag sätt skicka sträng det visar ”okänt” som utdata, vilket är fel, och jag skulle få ”identifieras” som utdata. Kan någon vägleda mig här för att uppnå resultatet.
Obs: Jag får utdata som jag ville med readStringUntil-funktionen men strängarna har mycket ”.” i det, därför inte användbart.
Kommentarer
Svar
Om du ställer in din seriell bildskärms rad som slutar på ”Både NL & CR”, då kommer denna kod att hitta ordet ”skicka”. Det kommer INTE att hitta ordet ”skicka” i denna sträng, ”ssend” eller i den här strängen ”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"); } } }
Om du vill hitta strängen ”send” i ”1234send” eller ”send1234” eller ”1234send5678” använd sedan 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"); } } }
Svar
Det finns oavsett antal anledningar till att * .equals-testet är falskt. Tänk på skillnad mellan fall och extra tecken från din kommunikationskälla. Även tecken som inte kan skrivas ut kan utgöra ett problem och orsaka att testet misslyckas.
Överväg att * .substring () istället. Den här metoden returnerar true om substratet hittas. Till exempel:
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"); }
… bör alltid returnera ”identifierad” eftersom tecknen ”s”, ”e”, ”n” och ”d” finns i rätt ordning i strängsträngen En.
Kommentarer
- Strängstr = Serial.readString (); om (str.substring (0) == " skicka ") Serial.println (" identifierad "); annat Serial.println (" okänt "); detta fungerade inte ens.
- Udda. Tittade du på länken till webbsidan för att se till att du använde substring korrekt? ( Denna webbsida? ). Jag ser också från kommentarerna att du skrev ut den mottagna strängen och att du såg " skickade " i det mottagna meddelandet, korrekt? Du kanske bara vill kommentera den seriella läsraden och försöka använda " String str = " 12345 skicka 1234 "; " för att testa om allt fungerar. Att döma av andra kommentarer kan du snabbt försöka skicka (skriva in) " space " + " skicka " + " mellanslag " (" skicka ") för att se om det fungerar.
- Det vann ' t. substring (n) returnerar bara den del av strängen som börjar vid position n. Så substring (0) returnerar bara en kopia av strängen. str.substring (0,4) kommer att returnera fristens 4 tecken i strängen (förutsatt att det inte finns fyra tecken att returnera – Jag ' är inte tillräckligt bekant med denna implementering för att veta vad det gör för en kortare sträng – C # skulle ge ett undantag).
Svar
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"); } } }
Kommentarer
- Läser strängen " skicka " att använda kommandot Serial.readString () är bra. Men på något sätt fungerar det inte om du använder resultatet för att jämföra (t.ex. data == " skicka " …). En möjlig lösning är att använda teckenuppsättning (t.ex. inChar [5]). Storleken på matrisen är 1 mer än maximalt antal tecken som behövs.
\r\n
inte/r/n
…