Very Basic Arduino Uno Serial.readString () operasjon

Jeg er veldig ny på Arduino programmering. Jeg prøver å identifisere inngangsstrengen fra seriell skjerm og skrive utdataene til konsollen tilsvarende

Koden er:

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 jeg put send string det viser «ukjent» som utdata, noe som er feil, og jeg skulle få «identifisert» som utdata. Kan noen veilede meg hit for å oppnå resultatet.

Merk: Jeg får utdata som jeg ville ved å bruke readStringUntil-funksjonen, men strengene har mye «.» i den, derav ikke nyttig.

Kommentarer

  • hva er linjeinnstillingen din i Serial Monitor?
  • både NL og CR.
  • så sjekk for " send / r / n "
  • Du mener \r\n ikke /r/n
  • Problemet med å stole på ting som readString er at du ikke gjør ' vet ikke hva de gjør eller hvordan de jobber. Parse innkommende data manuelt slik at du vet hva det er du jobber med.

Svar

Hvis du angir linjen til din Serial Monitor som slutter til «Begge NL & CR», så vil denne koden finne ordet «send». Den vil IKKE finne ordet «send» i denne strengen, «ssend» eller i denne strengen, «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"); } } } 

Hvis du vil finne strengen «send» i «1234send» eller «send1234» eller «1234send5678» bruk deretter 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 er av en rekke årsaker til at * .equals-testen er falsk. Vurder saksforskjell eller ekstra tegn som er introdusert fra kilden til kommunikasjonen. Selv tegn som ikke kan skrives ut, kan utgjøre et problem og føre til at testen mislykkes.

Vurder å bruke * .substring () i stedet. Denne metoden vil returnere true hvis understrengen blir funnet. For eksempel:

 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 returner «identifisert» fordi tegnene «s», «e», «n» og «d» finnes i riktig rekkefølge i strengstrengenOne.

Kommentarer

  • Streng str = Serial.readString (); hvis (str.substring (0) == " send ") Serial.println (" identifisert "); annet Serial.println (" ukjent "); dette fungerte ikke engang.
  • Odd. Så du på lenken til websiden for å forsikre deg om at du brukte substring riktig? ( Denne websiden? ). Jeg ser også fra kommentarene at du skrev ut den mottatte strengen, og at du så " send " i den mottatte meldingen, riktig? Det kan være lurt å kommentere den serielle leselinjen og prøve å bruke " String str = " 12345 send 1234 "; " for å teste om alt fungerer. Bedømme etter andre kommentarer, kan du raskt prøve å sende (skrive inn) " space " + " send " + " mellomrom " (" send ") for å se om det fungerer.
  • Det vant ' t. substring (n) returnerer bare den delen av strengen som begynner på posisjon n. Så substring (0) returnerer bare en kopi av strengen. str.substring (0,4) vil returnere frist 4 tegn i strengen (forutsatt at det ikke er 4 tegn å returnere – jeg ' er ikke kjent nok med denne implementeringen til å vite hva det gjør for en kortere streng – C # vil kaste et unntak).

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

  • Lesing av strengen " send " å bruke kommandoen Serial.readString () er greit. Men på en eller annen måte vil det ikke fungere hvis du bruker resultatet for å sammenligne (f.eks. Data == " send " …). En mulig løsning er å bruke tegnmatrise (f.eks. InChar [5]). Matrisens størrelse er 1 mer enn det maksimale antallet tegn som trengs.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *