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
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.
\r\n
nie/r/n
…