Bardzo podstawowa obsługa Arduino Uno Serial.readString ()

Programowanie Arduino jest dla mnie bardzo nowe. Próbuję zidentyfikować ciąg wejściowy z monitora szeregowego i odpowiednio wypisać dane wyjściowe do konsoli

Kod to:

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

Kiedykolwiek i put send string, pokazuje „nieznane” jako dane wyjściowe, co jest błędne i powinienem zostać „zidentyfikowany” jako wyjście. Czy ktoś może mnie tu poprowadzić, aby osiągnąć wynik.

Uwaga: Otrzymuję dane wyjściowe tak, jak chciałem, używając funkcji readStringUntil, ale w łańcuchach jest dużo znaków „”. w nim, więc nieprzydatne.

Komentarze

  • jakie jest ustawienie końca linii w Serial Monitor?
  • zarówno NL, jak i CR.
  • następnie sprawdź " send / r / n "
  • Masz na myśli \r\n nie /r/n
  • Problem z poleganiem na takich rzeczach jak readString polega na tym, że naprawdę nie ' nie wiem, co robią i jak pracują. Analizuj ręcznie przychodzące dane, aby wiedzieć, nad czym pracujesz.

Odpowiedz

Jeśli ustawisz wiersz monitora szeregowego kończy się na „Both NL & CR”, wtedy ten kod znajdzie słowo „wyślij”. NIE znajdzie słowa „wyślij” w tym ciągu, „ssend” lub w tym ciągu „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"); } } } 

Jeśli chcesz znaleźć ciąg „send” w „1234send” lub „send1234” lub „1234send5678”, a następnie użyj 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"); } } } 

Odpowiedź

Istnieją z dowolnej liczby powodów, dla których test * .equals jest fałszywy. Weź pod uwagę różnicę wielkości liter lub dodatkowe znaki wprowadzone ze źródła wiadomości. Nawet znaki niedrukowalne mogą stanowić problem i spowodować niepowodzenie testu.

Rozważ użycie Zamiast tego * .substring () . Ta metoda zwróci wartość true, jeśli zostanie znaleziony podciąg. Na przykład:

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

… powinno zawsze zwraca „zidentyfikowany”, ponieważ znaki „s”, „e”, „n” i „d” znajdują się we właściwej kolejności w ciągu stringOne.

Komentarze

  • String str = Serial.readString (); if (str.substring (0) == " send ") Serial.println (" zidentyfikowano "); else Serial.println (" nieznany "); to nawet nie zadziałało.
  • Dziwne. Czy spojrzałeś na link do strony internetowej, aby upewnić się, że używasz podłańcucha poprawnie? ( Ta strona internetowa? ). Z komentarzy wynika również, że wydrukowałeś otrzymany ciąg i zobaczyłeś w otrzymanej wiadomości " send ", poprawny? Możesz po prostu zakomentować linię odczytu szeregowego i spróbować użyć " String str = " 12345 send 1234 "; ", aby sprawdzić, czy wszystko działa. Sądząc po innych komentarzach, możesz szybko spróbować wysłać (wpisując) " spacja " + " wyślij " + " spacja " (" wyślij "), aby sprawdzić, czy to zadziała.
  • To nie działa '. substring (n) po prostu zwraca część ciągu zaczynającą się na pozycji n. Więc podciąg (0) po prostu zwraca kopię ciągu. str.substring (0,4) zwróci pierwsze 4 znaki ciągu (zakładając, że mają co najmniej 4 znaki do zwrócenia – ja ' nie jestem wystarczająco zaznajomiony z tą implementacją, aby wiedzieć co robi to dla krótszego ciągu – C # zgłosi wyjątek).

Odpowiedź

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

Komentarze

  • Czytanie ciągu " send " użycie polecenia Serial.readString () jest w porządku. Ale jakoś to nie zadziała, jeśli użyjesz wyniku do porównania (np. Data == " send " …). Możliwym rozwiązaniem jest użycie tablicy znaków (np. InChar [5]). Rozmiar tablicy jest o 1 większy niż maksymalna wymagana liczba znaków.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *