Velmi základní operace Arduino Uno Serial.readString ()

Jsem v programování Arduino velmi nová. Snažím se identifikovat vstupní řetězec ze sériového monitoru a odpovídajícím způsobem tisknout výstup na konzolu.

Kód je:

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

Kdykoli jsem vložte odesílací řetězec, který zobrazuje „neznámý“ jako výstup, což je špatné, a měl bych se dostat „identifikován“ jako výstup. Může mě někdo vést, abych dosáhl výsledku.

Poznámka: Pomocí funkce readStringUntil dostávám výstup tak, jak jsem chtěl, ale řetězce mají hodně „.“ v tom tedy není užitečné.

Komentáře

  • jaké je vaše nastavení konce řádku v Serial Monitoru?
  • jak NL, tak ČR.
  • poté zkontrolujte " send / r / n "
  • máte na mysli \r\n not /r/n
  • Problém spoléhání se na věci, jako je readString, je, že opravdu ned ' neví, co dělají nebo jak pracují. Analyzujte příchozí data ručně, abyste věděli, s čím pracujete.

Odpovědět

Pokud nastavíte řádek vašeho Serial Monitoru končící na „Both NL & CR“, pak tento kód najde slovo „send“. V tomto řetězci nenajde slovo „send“, „ssend“ nebo v tomto řetězci „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"); } } } 

Pokud chcete najít řetězec „send“ v „1234send“ nebo „send1234“ nebo „1234send5678“ pak použijte 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"); } } } 

odpověď

existují z mnoha důvodů je test * .equals nepravdivý. Vezměte v úvahu rozdíl malých a velkých písmen zavedený ze zdroje vaší komunikace. Dokonce i netisknutelné znaky mohou představovat problém a způsobit selhání testu.

Zvažte použití * .substring () . Tato metoda vrátí hodnotu true, pokud je nalezen podřetězec. Například:

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

… by měl vždy vrátit „identifikováno“, protože znaky „s“, „e“, „n“ a „d“ jsou v řetězci stringOne nalezeny ve správném pořadí.

Komentáře

  • String str = Serial.readString (); if (str.substring (0) == " odeslat ") Serial.println (" identifikováno "); else Serial.println (" neznámý "); to ani nefungovalo.
  • Zvláštní. Podívali jste se na odkazovanou webovou stránku, abyste se ujistili, že používáte podřetězec správně? ( Tato webová stránka? ). Z komentářů také vidím, že jste jej vytiskli z přijatého řetězce a v přijaté zprávě jste viděli " send ", opravit? Možná budete chtít okomentovat sériovou čtecí linku a zkusit použít " String str = " 12345 odeslat 1234 "; " otestovat, zda vše funguje. Při posuzování dalších komentářů byste se mohli rychle pokusit odeslat (zadat) " prostor " + " odeslat " + " prostor " (" pošlete "), abyste zjistili, zda to funguje.
  • To ale ' nefunguje. substring (n) právě vrací část řetězce začínající na pozici n. Takže podřetězec (0) pouze vrátí kopii řetězce. str.substring (0,4) vrátí první 4 znaky řetězce (za předpokladu, že se vrátí alespoň 4 znaky – nejsem ' dostatečně obeznámen s touto implementací, abych věděl co dělá to pro kratší řetězec – C # by způsobilo výjimku).

Odpověď

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

Komentáře

  • Čtení řetězce " odeslat " použití příkazu Serial.readString () je v pořádku. Ale nějak to nebude fungovat, pokud použijete výsledek pro porovnání (např. Data == " send " …). Možným řešením je použít znakové pole (např. InChar [5]). Velikost pole je o 1 větší než maximální počet znaků.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *