MarJanPol Napisano Grudzień 25, 2017 Udostępnij Napisano Grudzień 25, 2017 Witam, uczę się cały czas przejmowania przez Arduino danych przychodzących po UART z aplikacji smartfonowej RoboRemo i napotkałem problem. Próbuję wykorzystać dane pochodzące z akcelerometru telefonu, które są łańcuchami znaków: na początku tego łańcucha jest jeden z dwóch znaków: X lub Y (bo akcelerometr monitoruje obrót wokół 2 osi), potem jest spacja a następnie wartość liczbowa od 0 do 255. Chciałbym wykorzystać selektywnie tylko te dane, które dotyczą osi Y. Próbuję więc napisać programik, który będzie pokazywać wartość liczbową na monitorze portu szeregowego ale tylko dla osi Y. Ogólnie staram się przechwycić dane jako String, potem wyciąć niepotrzebne dane a następnie wartość liczbową zamienić na typ int - żeby wykorzystać ją później do sterowania PWM. Zastosowałem if-a, dzięki któremu na monitorze powinna wyświetlać się albo konkretna wartość dla Y albo napis "cokolwiek" - w przypadku X. Niestety coś nie działa i na monitorze cały czas pojawia się napis "cokolwiek" - tak jakby dane Y w ogóle nie docierały do Arduino. Ale wiem, że docierają. Dodam, że nie jestem informatykiem i języka C/C++ dla Arduino uczę się powoli samodzielnie na własnych próbach i błędach. Niestety błędów jest cały cza jeszcze dużo... 🙂 Poniżej kod. Z góry dziękuję za podpowiedź. Marek String sdane = ""; //zdefiniowanie zmiennych w klasie String do przechowywania łańcucha znaków String sXczyY= ""; String svalue= ""; int ivalue; void setup() { Serial1.begin(9600); //uruchomienie Serial1 do komunikacji UART przez moduł Bluetooth Serial.begin(9600); } void loop() { if(Serial1.available() >0) // jeśli na porcie szeregowym z Bluetooth (czyli Serial1) pojawią się jakieś dane z akcelerometru RoboRemoFree to wykonuj poniżej {sdane = Serial1.readStringUntil('\n'); //przypisanie otrzymanego łańcucha znaków do zmiennej sdane sXczyY = sdane.substring(0,1); //przypisanie zmiennej sXczyY pierwszego znaku - to jest X lub Y svalue = sdane.substring(2); //przypisanie zmiennej svalue aktualnej wartości liczbowej po usunięciu X/Y i spacji ivalue = svalue.toInt();} //transformacja wartości liczbowej przypisanej do zmiennej w klasie String na zmienną typu int sprawdzenie();} void sprawdzenie() { if (sXczyY == 'Y') {Serial.println(ivalue); delay(2000);} else {Serial.println("cokolwiek"); delay(2000);} } Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 25, 2017 Udostępnij Grudzień 25, 2017 Porównujesz stringa z charem. Spróbuj porównywać stringa ze stringiem (używając "Y" zamiast 'Y') albo chara z charem (używając char sXczyY = sdane[0]). Cytuj Link do komentarza Share on other sites More sharing options...
MarJanPol Grudzień 25, 2017 Autor tematu Udostępnij Grudzień 25, 2017 Faktycznie. Teraz wszystko działa jak należy. Dziękuję! ... i Świąt pozytywnych życzę przy okazji... mar Cytuj Link do komentarza Share on other sites More sharing options...
MarJanPol Grudzień 29, 2017 Autor tematu Udostępnij Grudzień 29, 2017 A jeszcze nawiązując trochę do tematu - znalazłem na forum.arduino.cc taką oto instrukcję pobierania i przekazywania dalej łańcucha znaków: LINK DO STRONY - // Example 2 - Receive with an end-marker const byte numChars = 32; char receivedChars[numChars]; // an array to store the received data boolean newData = false; void setup() { Serial.begin(9600); Serial.println("<Arduino is ready>"); } void loop() { recvWithEndMarker(); showNewData(); } void recvWithEndMarker() { static byte ndx = 0; char endMarker = '\n'; char rc; while (Serial.available() > 0 && newData == false) { rc = Serial.read(); if (rc != endMarker) { receivedChars[ndx] = rc; ndx++; if (ndx >= numChars) { ndx = numChars - 1; } } else { receivedChars[ndx] = '\0'; // terminate the string ndx = 0; newData = true; } } } void showNewData() { if (newData == true) { Serial.print("This just in ... "); Serial.println(receivedChars); newData = false; } } Zastanawiam się czy nie można prościej? (ale dalej używając klasy Serial a nie String) mar Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!