Mycket grundläggande Arduino Uno Serial.readString () operation

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

  • vad är din radinställning i Serial Monitor?
  • både NL och CR.
  • och leta efter " skicka / r / n "
  • Du menar \r\n inte /r/n
  • Problemet med att förlita sig på saker som readString är att du verkligen inte ' vet inte vad de gör eller hur de fungerar. Analysera inkommande data manuellt så att du vet vad det är du arbetar med.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *