Meget grundlæggende Arduino Uno Serial.readString () operation

Jeg er meget ny i Arduino programmering. Jeg prøver at identificere inputstrengen fra seriel skærm og udskrive output til konsollen i overensstemmelse hermed

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 sæt send streng det viser “ukendt” som output, hvilket er forkert, og jeg skulle få “identificeret” som output. Kan nogen guide mig her for at opnå resultatet.

Bemærk: Jeg får output, som jeg vil, ved at bruge readStringUntil-funktionen, men strengene har meget “.” i det, derfor ikke nyttigt.

Kommentarer

  • hvad er din linjeindstilling i Serial Monitor?
  • både NL og CR.
  • Kontroller derefter for " send / r / n "
  • Du mener \r\n ikke /r/n
  • Problemet med at stole på ting som readString er, at du virkelig ikke ' ved ikke, hvad de laver, eller hvordan de arbejder. Parser de indgående data manuelt, så du ved, hvad det er, du arbejder med.

Svar

Hvis du indstiller linjen til din Serial Monitor slutter til “Begge NL & CR”, så finder denne kode ordet “send”. Den finder IKKE ordet “send” i denne streng “ssend” eller i denne streng, “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 finde strengen “send” i “1234send” eller “send1234” eller “1234send5678” brug derefter 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

Der er af en række grunde til, at * .equal-testen er falsk. Overvej store forskelle eller ekstra tegn introduceret fra kilden til din kommunikation. Selv tegn, der ikke kan udskrives, kan udgøre et problem og få testen til at mislykkes.

Overvej at bruge * .substring () i stedet. Denne metode returnerer sandt, hvis understrengen findes. 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"); } 

… skal altid returner “identificeret”, fordi tegnene “s”, “e”, “n” og “d” findes i den rigtige rækkefølge inden for strengstrengenOne.

Kommentarer

  • String str = Serial.readString (); hvis (str.substring (0) == " send ") Serial.println (" identificeret "); ellers Serial.println (" ukendt "); dette fungerede ikke engang.
  • Odd. Kiggede du på linket til webside for at sikre dig, at du brugte substring korrekt? ( Denne webside? ). Jeg ser også fra kommentarerne, at du har udskrevet den modtagne streng, og du så " send " i den modtagne besked, korrekt? Du vil måske bare kommentere den serielle læselinje og prøve at bruge " String str = " 12345 send 1234 "; " for at teste, om alt fungerer. At dømme efter andre kommentarer, kan du hurtigt prøve at sende (skrive) " space " + " send " + " mellemrum " (" send ") for at se, om det virker.
  • Det vandt ' t arbejde. substring (n) returnerer bare den del af strengen, der starter ved position n. Så substring (0) returnerer bare en kopi af strengen. str.substring (0,4) vil returnere fristens 4 tegn i strengen (forudsat at der skal være 4 tegn til at vende tilbage – Jeg ' er ikke fortrolig nok med denne implementering til at vide hvad det gør for en kortere streng – C # kaster en undtagelse).

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æsning af strengen " send " at bruge kommandoen Serial.readString () er fint. Men på en eller anden måde fungerer det ikke, hvis du bruger resultatet til sammenligning (f.eks. Data == " send " …). En mulig løsning er at bruge tegnarray (f.eks. InChar [5]). Matrixens størrelse er 1 mere end det maksimale antal tegn, der kræves.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *