Kurs Arduino #6: UART komunikacja Arduino – PC

3.Różnica pomiędzy char, a String

Wysyłanie komend do Arduino możemy zrealizować, przy pomocy dwóch funkcji char oraz String. Przy pomocy pierwszej funkcji informujemy Arduino, że ma oczekiwać jeden znak 

spoiler
znak sygnal

natomiast, przy użyciu String, ma się spodziewać łańcucha znaków. W funkcji warunkowej if() oczekiwany znak char zapisujemy w apostrofach ‚ ‚, a String przy pomocy cudzysłowów ” „. W przypadku Arduino nie jest to jakoś bardzo ważne, ale warto mieć świadomość o takich funkcjach, oraz umieć je wykorzystać. Zatem char wykorzystujemy gdy chcemy wysłać komendę składającą się z jednego znaku, a String, jak chcemy wysłać ciąg znaków.

4. Wysyłanie danych z komputera do Arduino przy użyciu char

Aby nie pisać od nowa kodu, to wykorzystamy nasz poprzedni.

Na samym początku musimy poinformować Arduino, że chcemy wysyłać do niego dane. W tym celu wykorzystujemy funkcję Serial.available().  Ona sprawdza, czy jakieś dane znajdują się w buforze odbioru. Dlatego musimy zapisać to jako warunek, czyli:

Jeżeli wartość bufora odbioru jest większa od zera to… teraz musimy zdefiniować zmienną dane, jako char oraz przypisać jej odczyt danych z portu szeregowego:

Teraz pozostało nam już zapisanie prostych warunków dla realizacji komend:

Jeżeli odebrany znak to R to wykonaj operacje zawarte w nawiasach klamrowych. Zwróć uwagę na wykorzystanie apostrofów. Po skompilowaniu i wgraniu naszego programu powinniśmy otrzymać następujący efekt:

Teraz możemy przejść do sposobu wykorzystania funkcji String

5. Wysyłanie danych z komputera do Arduino przy użyciu String

Kod będzie się nieznacznie różnić od poprzedniego:

Pierwsza różnica to definicja zmiennej jako String oraz zawarcie ciągu znaków pomiędzy cudzysłowami (3. linia). Następnie zmienną przypisujemy do funkcji odczytu ciągu znaków Serial.readStringUntil(), gdzie ma odczytać wszystkie znaki do zakończenia linii (‚\n’)

Następnie modyfikujemy funkcję warunkową, po przez wstawienie komendy składającej się z ciągu znaków:

Teraz możemy skompilować nasz program i wgrać. Powinniśmy otrzymać efekt jak na filmie poniżej:

Jak widać przy wykorzystaniu funkcji String odczyt komendy trwa znaczenie dłużej niż przy wykorzystaniu funkcji char. Niemniej jednak jak użyjemy dłuższej komendy to czas jej przetworzenia nie wzrośnie.

6. Różnica pomiędzy Serial.print(), a Serial.write()

Wcześniej wspomniałem o różnicach pomiędzy Serial.print() a Serial.println(), ale oprócz tych dwóch funkcji mamy jeszcze jednego zawodnika jakim jest Serial.write(), który to przetwarza znaki w systemie dziesiętnym na znaki ASCII.

Przykład:

Ciąg znaków „49” w systemie dziesiętnym oznacza w systemie ASCII liczbę „1”, jeżeli wstawimy „90” to na monitorze portu szeregowego otrzymamy „Z”.

Oprócz konwersji na ASCII, Arduino oferuje nam również konwersje znaków na system znaków binarnych, ósemkowych, dziesiętnych i szesnastkowych. Sposób ich wykorzystania jest bardzo prosty:

Program jest prostym licznikiem, który co dwie sekundy dodaje do naszej podstawowej zmiennej jedną cyfrę. Następnie tą cyfrę przetwarza na dany system:

Po dodaniu członu BIN, informujemy mikrokontroler, że wynik zmiennej ma przetworzyć na system binarny. W efekcie otrzymujemy takie informacje zwrotne:

konwersja