Olen Arduino-ohjelmoinnissa aivan uusi. Yritän tunnistaa syötemerkkijonon sarjamonitorista ja tulostaa lähdön konsolille vastaavasti.
Koodi on:
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"); } } }
Aina kun Laita lähetysmerkkijono se näyttää ”tuntematon” tuotoksena, mikä on väärä, ja minun pitäisi saada ”tunnistaa” tuotokseksi. Voisiko kukaan ohjata minua tänne tuloksen saavuttamiseksi.
Huomaa: saan tulosteen haluamallani tavalla käyttämällä readStringUntil-toimintoa, mutta merkkijonoissa on paljon ”.” siinä, joten siitä ei ole hyötyä.
Kommentit
Vastaa
Jos määrität Serial Monitorisi rivillä päättyy ”Both NL & CR”, niin tämä koodi löytää sanan ”send”. Se EI löydä sanaa ”send” tässä merkkijonossa, ”ssend” tai tässä merkkijonossa ”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"); } } }
Jos haluat löytää merkkijonon ”send” kansiosta ”1234send” tai ”send1234” tai ”1234send5678” käytä sitten 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"); } } }
vastaus
On olemassa mistä tahansa syystä * .equals -testi on väärä. Harkitse viestien lähteestä lisättyjä kirjainkokoja tai ylimääräisiä merkkejä. Jopa ei-tulostettavat merkit voivat aiheuttaa ongelman ja aiheuttaa testin epäonnistumisen.
Harkitse Sen sijaan * .substring () . Tämä menetelmä palauttaa arvon true, jos alimerkkijono löytyy. Esimerkiksi:
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"); }
… pitäisi aina palauta ”tunnistettu”, koska merkit ”s”, ”e”, ”n” ja ”d” löytyvät oikeasta järjestyksestä merkkijonossa stringOne.
Kommentit
- String str = Serial.readString (); if (str.substring (0) == " lähetä ") Serial.println (" tunnistettu "); else Serial.println (" tuntematon "); tämä ei toiminut edes.
- Pariton. Katsoitko linkitettyyn verkkosivuun varmistaaksesi, että käytät alimerkintöjä oikein? ( Tämä verkkosivu? ). Kommenteista näen myös, että tulit sen tulostamaan vastaanotetun merkkijonon ja näet " lähettänyt " vastaanotetussa viestissä, oikea? Haluat vain kommentoida sarjalukuriviä ja yrittää käyttää " String str = " 12345 lähettää 1234 "; " testataksesi, toimiiko kaikki. Muiden kommenttien perusteella voit yrittää nopeasti lähettää (kirjoittamalla) " välilyönti " + " lähetä " + " väli " (" send ") nähdäksesi, toimiiko se.
- Se ei voittanut ' t. alimerkkijono (n) palauttaa vain merkkijonon osan aloittaen kohdasta n. Joten alaotsikko (0) palauttaa vain kopion merkkijonosta. str.substring (0,4) palauttaa merkkijonon neljä ensimmäistä merkkiä (olettaen, että siinä on vähintään 4 merkkiä palata – en ole ' m ole tarpeeksi perehtynyt tähän toteutukseen tietämään mitä se tekee lyhyemmälle merkkijonolle – C # heittää poikkeuksen).
Vastaa
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"); } } }
kommentit
- merkkijonon lukeminen " send " Serial.readString () -komennon käyttö on hieno. Mutta jotenkin se ei toimi, jos käytät tulosta vertailuun (esim. Data == " send " …). Mahdollinen ratkaisu on käyttää merkistöä (esim. InChar [5]). Taulukon koko on 1 suurempi kuin vaadittujen merkkien enimmäismäärä.
\r\n
ei/r/n
…