Nagyon egyszerű Arduino Uno Serial.readString () művelet

Nagyon új vagyok az Arduino Programmingban. Megpróbálom azonosítani a soros monitor bemeneti karakterláncát, és ennek megfelelően kinyomtatom a kimenetet a konzolra.

A kód:

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

Amikor i tedd a send karakterláncot, amely kimenetként “ismeretlen” -t mutat, ami hibás, és kimenetként “azonosítani” kell. Tudna valaki ide vezetni az eredmény elérése érdekében.

Megjegyzés: A readStringUntil függvény használatával a kívánt eredményt kapom, de a húrok sok “” karaktert tartalmaznak. benne, ezért nem hasznos.

Megjegyzések

  • mi a sorvégi beállítása a Serial Monitorban?
  • mind NL, mind pedig NL CR.
  • majd ellenőrizze a " send / r / n "
  • \r\n nem /r/n
  • Az a probléma, hogy olyan dolgokra támaszkodunk, mint például az readString, valóban nem ' nem tudom, mit csinálnak vagy hogyan működnek. A beérkező adatokat manuálisan elemezze, hogy tudja, mi az, amivel dolgozik.

Válasz

Ha beállította a Serial Monitor sora “Mindkét NL & CR” -re végződik, akkor ez a kód megtalálja a “send” szót. NEM fogja megtalálni a “send” szót ebben a karakterláncban, “ssend” vagy ebben a karakterláncban a “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"); } } } 

Ha a “send” karakterláncot az “1234send” vagy a “send1234” mezőben szeretné megtalálni, vagy “1234send5678”, majd használja az 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"); } } } 

Válasz

tetszőleges számú ok, ami miatt a * .equals teszt hamis. Vegye figyelembe az esetkülönbséget vagy a kommunikáció forrásából bevezetett extra karaktereket. Még a nem nyomtatható karakterek is problémát okozhatnak, és a teszt kudarcát okozhatják.

Fontolja meg * .substring () helyett. Ez a módszer igaz lesz, ha megtalálható az allánc. Például:

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

… mindig adja vissza az “azonosított” szót, mert az “s”, “e”, “n” és “d” karakterek a megfelelő sorrendben találhatók a stringOne karakterláncban.

Megjegyzések

  • String str = Serial.readString (); if (str.substring (0) == " send ") Soros.println (" azonosított "); else Serial.println (" ismeretlen "); ez még nem működött.
  • Páratlan. Megtekintette a weboldalra mutató linket, hogy megbizonyosodjon arról, hogy helyesen használja-e az alszöveget? ( Ez a weboldal? ). A megjegyzésekből azt is látom, hogy kinyomtatta a beérkezett karakterláncot, és látta a " send " üzenetet a fogadott üzenetben, helyes? Érdemes csak megjegyzést fűznie a soros olvasási sorhoz, és megpróbálja használni a " karakterláncot str = " 12345 1234 küldése “>

; " annak ellenőrzésére, hogy minden működik-e. Más megjegyzéseket elbírálva gyorsan megpróbálhatja elküldeni (beírni) " space " + " küldés " + " szóköz " (" send "), hogy lássa, működik-e.

  • Ez nem fog eredményt ' t használni. az (n) sztring csak a karakterláncnak az n pozíciótól kezdődő részét adja vissza. Tehát a (0) szubsztring csak a string másolatát adja vissza. Az str.substring (0,4) a karakterlánc első 4 karakterét adja vissza (feltételezve, hogy legalább 4 karakter visszatérjen – I ' nem vagyok eléggé ismerős ebben a megvalósításban ahhoz, hogy tudjam, mi rövidebb karakterlánc esetén – a C # kivételt vetne).
  • Válasz

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

    Megjegyzések

    • A karakterlánc olvasása " send " a Serial.readString () parancs használata rendben van. De valahogy nem fog működni, ha az eredményt összehasonlításra használja (pl. Adatok == " send " …). Lehetséges megoldás a karaktertömb használata (pl. InChar [5]). A tömb mérete 1-gyel nagyobb, mint a maximálisan szükséges karakterek száma.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük