Hyvin yksinkertainen Arduino Uno Serial.readString () -toiminto

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

  • mikä on rivisi lopetusasetuksesi Serial Monitorissa?
  • sekä NL että CR.
  • tarkista sitten " send / r / n "
  • Tarkoitatko \r\n ei /r/n
  • ReadStringin kaltaisiin asioihin luottamisen ongelma on, että et todellakaan ole ' tiedä mitä he tekevät tai miten he työskentelevät. Jäsennä saapuvat tiedot manuaalisesti, jotta tiedät, millaista työskentelet.

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ä.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *