Operație foarte simplă Arduino Uno Serial.readString ()

Sunt foarte nou în programarea Arduino. Încerc să identific șirul de intrare de pe monitorul serial și tipăresc ieșirea pe consolă în consecință

Codul este:

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"); } } } 

Ori de câte ori i puneți șirul de trimitere arată „necunoscut” ca ieșire, ceea ce este greșit și ar trebui să fiu „identificat” ca ieșire. Poate cineva să mă ghideze aici pentru a obține rezultatul.

Notă: obțin rezultate după cum am dorit folosind funcția readStringUntil, dar șirurile au o mulțime de „.” în ea, prin urmare, nu este util.

Comentarii

  • care este setarea dvs. de capăt de linie în Serial Monitor?
  • atât NL, cât și CR.
  • apoi verificați dacă " trimite / r / n "
  • Adică \r\n nu /r/n
  • Problema cu bazarea pe lucruri precum readString este că într-adevăr nu ' nu știu ce fac sau cum funcționează. Analizați manual datele primite, astfel încât să știți cu ce lucrați.

Răspundeți

Dacă setați linia Serial Monitor „care se termină cu” Both NL & CR „, atunci acest cod va găsi cuvântul” send „. NU va găsi cuvântul” send „în acest șir, „ssend” sau în acest șir, „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"); } } } 

Dacă doriți să găsiți șirul „send” în „1234send” sau „send1234” sau „1234send5678” apoi utilizați 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"); } } } 

Răspuns

Există orice număr de motive pentru care testul * .equals este fals. Luați în considerare diferența de majuscule sau caracterele suplimentare introduse din sursa comunicațiilor dvs. Chiar și caracterele care nu se pot tipări pot pune o problemă și pot cauza eșecul testului. * .substring () în schimb. Această metodă va reveni adevărată dacă se găsește șirul. De exemplu:

 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"); } 

… ar trebui întotdeauna returnează „identificat” deoarece caracterele „s”, „e”, „n” și „d” se găsesc în secvența corectă din șirul stringOne.

Comentarii

  • String str = Serial.readString (); if (str.substring (0) == " trimite ") Serial.println (" identificat "); else Serial.println (" necunoscut "); acest lucru nu a funcționat nici măcar.
  • Impar. Te-ai uitat la pagina legată de web pentru a te asigura că folosești corect șirul de caractere? ( Această pagină web? ). De asemenea, văd din comentarii că l-ați tipărit șirul primit și ați văzut " trimitând " în mesajul primit, corect? Poate doriți doar să comentați linia de citire în serie și să încercați să utilizați " String str = " 12345 trimite 1234 "; " pentru a testa dacă totul funcționează. Judecând pentru alte comentarii, ați putea încerca rapid să trimiteți (tastând) " spațiu " + " trimite " + " spațiu " (" trimite ") pentru a vedea dacă funcționează.
  • Acest lucru a câștigat '. substring (n) returnează doar porțiunea șirului începând de la poziția n. Deci, șirul (0) returnează doar o copie a șirului. str.substring (0,4) va returna primele 4 caractere ale șirului (presupunând că cel puțin 4 caractere vor fi returnate – nu ' nu sunt suficient de familiarizat cu această implementare pentru a ști face pentru un șir mai scurt – C # ar arunca o excepție).

Răspuns

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"); } } } 

Comentarii

  • Citirea șirului " trimite " utilizarea comenzii Serial.readString () este în regulă. Dar cumva nu va funcționa dacă utilizați rezultatul pentru comparare (de exemplu, date == " trimiteți " …). O posibilă soluție este utilizarea matricei de caractere (de exemplu, inChar [5]). Dimensiunea matricei este cu 1 mai mult decât numărul maxim de caractere necesare.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *