Komunikacja szeregowa z przetwarzaniem

Komunikacja szeregowa z przetwarzaniem

Komunikacja szeregowa z przetwarzaniem

Klasa seryjna

Operacje, w których należy używać komunikacji szeregowej Przetwarzanie są zdefiniowane w klasie Serial.Pierwsza operacja, którą należy wykonać, aby użyć ich w programie (szkic) będzie włączenie go do kodu za pomocą import processing.serial.*;.

Spis treści

    Klasa Serial Posiada pięć różnych konstruktorów w zależności od wskazanych parametrów. Jedynym wymaganym parametrem jest obiekt nadrzędny (roślina mateczna), który zwykle odpowiada głównemu programowi (powiedzmy, oknu programu) klasy PApplet. Jak zwykle rodzicem będzie pisany program (plik szkic current), wartość tego pierwszego obowiązkowego parametru będzie wynosić this.

    Pozostałych pięć parametrów, które można przekazać konstruktorowi, to ① prędkość, ② nazwa portu szeregowego, ③ parytet użyte w protokole, ④ bity danych i ⑤ bity stopu. Najczęściej przekazywanymi parametrami, oprócz wymaganego obiektu nadrzędnego, są nazwa portu i prędkość.

    La prędkość komunikacji szeregowej jest liczbą całkowitą (int) to domyślnie ustawiona jest wartość 9600 jeśli ten parametr nie zostanie przekazany do konstruktora.

    Dostępne porty szeregowe. Metoda listowa

    El nazwa portu ma postać określoną przez system, w ten sposób np. w Dystrybucje Linuksa będzie coś takiego /dev/ttyS4 / dev / ttyACM3 o / dev / ttyUSB1 (w zależności od typu portu), natomiast w systemie Windows będzie to mniej więcej coś takiego COM12. Jeśli port nie jest fizycznie powiązany z urządzeniem, program zwykle nie będzie wiedział, którego portu użyć. Powszechnym sposobem wyboru portu jest uzyskanie listy dostępnych portów, pokazanie jej użytkownikowi i umożliwienie mu wybrania tego, którego chce używać. Metoda Serial.list() zwraca wektor ciągów tekstowych (String) z nazwami portów dostępnych w systemie.

    Port używany domyślnie przez bibliotekę Serial jest pierwszym z zwracanych przez metodę list (pewno COM1 w systemie Windows lub /dev/ttyS0 en GNU / Linux). Z wyjątkiem bardzo ograniczonych kontekstów, w których sprzęt, na którym pracuje się, jest ściśle znany (np. system w trybie kiosku), zwykle nie jest on pomijany i wyraźnie wskazany jest port docelowy.

    Przetwarzanie szeregowego portu szeregowego Linux ttyACM ttyS ttyUSB

    Powyższy zrzut ekranu przedstawia dane wyjściowe systemu GNU / Linux który ma cztery porty szeregowe RS 232 (ttyS0 a ttyS3) i pięć adapterów dwóch typów (ttyACM0 a ttyACM1 y ttyUSB0 a ttyUSB2).

    Uprawnienia urządzeń szeregowych Linux ttyACM ttyS ttyUSB

    Aby uzyskać dostęp do portów szeregowych, użytkownik musi należeć do grupy, do której system je przypisuje tty o połączenie telefoniczne. Na zrzucie ekranu powyższego obrazu widać, że porty szeregowe wymienione na liście ls /dev/tty[ASU]* -la należą do grupy połączenie telefoniczne który ma na nich uprawnienia do odczytu i zapisu.

    Parametry protokołu szeregowego

    La parytet komunikacji szeregowej jest wyrażony w Przetwarzanie jako postać (char), które mogą przyjmować wartości: ① N (Żaden), aby nie wykryć parytet, ② E (nawet), aby wskazać, że Bit parzystości jest parzysta, ③ O (nieparzysty), aby wskazać, że Bit parzystości jest dziwne, ④ M (znak), aby zawsze robić Bit parzystości i ⑤ S (przestrzeń), aby zawsze uczynić jednego Bit parzystości. Wartość domyślna, jeśli nie została przekazana do konstruktora jako parametr, to N (bez parytet).

    Liczba bity danych, domyślnie osiem, wskazuje liczbę bitów tworzących ładunek danych netto (zwany znakiem lub czasem słowem), który jest przesyłany w każdej podstawowej jednostce ramki. Parametr wskazujący liczbę bitów danych wyrażony jest liczbą całkowitą (int).

    Wreszcie piąty możliwy parametr wskazuje czas trwania oceny końcowej, wyrażony jako zatrzymać bity (zatrzymaj bity), który jest oznaczony jako liczba przedstawiona w zmiennoprzecinkowy (float), które mogą przyjmować wartości 1.0 (wartość domyślna jeśli parametr nie jest przekazywany do konstruktora), 1.5lub 2.0.

    Konstruktory klasy Serial

    Na poniższej liście przedstawiono różne kombinacje parametrów, które można przekazać do konstruktora klasy Serial:

    • Serial(padre)
    • Serial(padre,puerto)
    • Serial(padre,velocidad)
    • Serial(padre,puerto,velocidad)
    • Serial(padre,puerto,velocidad,paridad,bits_datos,bits_parada)
    Zakończ komunikację szeregową. Metoda zatrzymania.

    Aby zwolnić port szeregowy przypisany podczas tworzenia instancji Serial, i że inne aplikacje systemowe mogą z niej korzystać, komunikacja z tą metodą jest kończona stop, który nie otrzymuje parametrów.

    Wyślij dane przez port szeregowy. Metoda zapisu

    Aby wysłać dane, klasa Serial de Przetwarzanie zawiera metodę write za pomocą którego możesz przesyłać ① ciągi tekstowe (String), ② bajtów lub ③ wektorów bajtów (byte[]). Warto o tym pamiętać byte en Przetwarzanie (Na Java) reprezentuje liczbę całkowitą z zakresu od -128 do 127 i domyślnie łańcuchy używają kodowania UTF-16.

    Odczyt danych z portu szeregowego

    Aby program mógł wykonywać inne zadania podczas odbierania danych przez port szeregowy, zwykle przechowuje się je w formacie a bufor otrzymane dane i w razie potrzeby odczytać je. Chociaż zwykle nie jest to zbyt wydajne, możesz zatrzymać aplikację, aby załadować wszystkie dostępne dane; Jednak najczęstszą rzeczą będzie odczytywanie informacji w miarę ich pojawiania się, w każdej iteracji draw, gdy dostępna jest określona ilość lub otrzymano specjalny kod.

    Ilość danych dostępnych w buforze. Dostępna metoda

    Aby dowiedzieć się, czy dane dotarły do bufor seria, metoda available zwraca liczbę bajtów, które zostały już w tym zapisane bufor. W obu przypadkach operacje odczytu mogą zwrócić wartość specjalną (np -1 o null) podczas próby załadowania danych z bufor seria, gdy jest pusta.

    Ładuj po jednym bajcie na raz. Metoda odczytu

    Główne metody zajęć Serial służące do odczytu informacji odbieranych przez port szeregowy to te typu „type read» różnią się między sobą przede wszystkim rodzajem danych, w jakich przekazują otrzymane informacje.

    read służy do dostarczania bajtów odbieranych przez port szeregowy jako wartość z zakresu od 0 do 255. Jako typ danych byte de Przetwarzanie reprezentuje zakres od -128 do 127, a nie od 0 do 255, konieczne jest użycie int w celu reprezentowania zakresu zwracanego przez read. Jeśli spróbujesz czytać za pomocą read i bufor ciąg jest pusty, zwraca wartość -1

    Odczytaj znaki z portu szeregowego. Metoda readChar

    Metoda readChar jest podobny a read ale zwraca wartość w formacie char zamiast int. Podobnie jak wewnętrznie, char en Przetwarzanie (Na Java) są przechowywane z dwoma bajtami, wartością wybraną do zwrócenia podczas odczytu readChar d bufor jest pusta seria 0xFFFF o -1.

    Załaduj ciąg tekstowy. Metody readString i readStringUntil.

    Metoda readString zwraca obiekt String utworzone na podstawie wszystkich danych dostępnych w bufor serii w momencie konsultacji.

    Metoda readString tworzy ciąg tekstowy przy założeniu, że bajty odebrane przez port szeregowy mają format ASCII więc tej metody odczytu nie można używać w przypadku innych kodowań.

    Jeśli chodzi o przeczytanie bufor serial z readString gdy jest pusty, zwracaną wartością jest null.

    Metoda readStringUntil dodać do readString możliwość zwrotu informacji załadowanych do pliku bufor seria dzieląca ją znakiem specjalnym (kodem), który jest przekazywany jako parametr. Taki sposób odczytania otrzymanej informacji pozwala wyróżnić zarówno separatory, jak i terminatory, które pomagają zinterpretować otrzymaną informację.

    Metoda readStringUntil przynieść z powrotem null kiedy w bufor series nie znajduje kodu określonego w przekazanym jej argumencie (jeden bajt).

    W poniższym kodzie dla Arduino wysyła trzy wiadomości przez port szeregowy. Pierwsze dwa kończą się zakładką, więc pojawią się w konsoli. Przetwarzanie, natomiast trzeci, choć zostanie przesłany przez port szeregowy, nie zostanie przez niego odczytany readStringUntil(9) ponieważ nie kończy się na karcie (z kodem ASCII 9).

    Przetwarzanie Serial.readStringUntil odczytać ciąg szeregowy

    Przeczytaj bloki danych. Metody readBytes i readBytesUntil.

    Przedstawione powyżej metody służą do odczytu danych w określonych formatach, do odczytu bloków danych surowych lub w formacie, który nie jest przewidziany w Przetwarzanie metody są stosowane readBytes y readBytesUntil

    Metoda readBytes spróbuj odczytać dane dostępne w pliku bufor seria. Jeśli do metody nie zostanie przekazany żaden parametr readBytes wszystkie dostępne dane są odczytywane i zwracane w postaci wektora (byte[]). Jeśli jako parametr zostanie przekazana liczba całkowita, odczytywana jest maksymalna liczba bajtów wskazywana przez tę liczbę i są one również zwracane jako wektor.

    Istnieje trzeci sposób użycia readBytes, bardziej wydajny, który przyjmuje jako argument wektor bajtowy, w którym zawartość bufor seria. Ten sposób użycia readBytes zwraca liczbę całkowitą (int) reprezentująca liczbę odczytanych bajtów.

    Metoda readBytesUntil działa w podobny sposób, ale zawiera pierwszy parametr reprezentujący wartość bajtu, który, jeśli zostanie znaleziony w bufor, wskaże koniec odczytu. W tej metodzie parametr określający maksymalną liczbę bajtów, które zostaną odczytane, nie ma sensu, ponieważ o ilości będzie decydował specjalny kod.

    Aby przetestować działanie metody readBytes Załóżmy, że następujący kod dla Arduino który wysyła SMS-a przez port szeregowy.

    Poniższy przykładowy program dla Przetwarzanie odczytuje tekst z portu szeregowego w 32-bajtowych blokach (TOTAL_BYTES). Aby sprawdzić, czy to działa, pokazuje to przez konsolę jako znaki, wymuszając typ odbieranych bajtów char.

    Na poniższym zrzucie ekranu możesz zobaczyć, jak są one wyświetlane w konsoli Przetwarzanie dane, które zostały załadowane w blokach o (maksymalnie) 32 bajtach (TOTAL_BYTES) za każdym razem. Ale jest problem, o którym była już mowa: Arduino przesyła wersety Federico Garcia Lorca przykładu zakodowanego jako tekst w formacie UTF-8, który nie jest tym używanym Przetwarzanie (Java), co wolisz UTF-16 więc ci, którzy nie odpowiadają rangi ASCII do druku są interpretowane nieprawidłowo.

    Przetwarzanie Serial.readBytes UTF-16

    Aby rozwiązać ten problem, można załadować zestawy znaków (charset) i zdefiniuj nowy obiekt String zmuszając go do reprezentowania go za pomocą kodowania UTF-8 jak pokazano w poniższym przykładowym kodzie.

    Przetwarzanie Serial.readBytes UTF-8

    Przeczytaj najnowsze otrzymane dane. Metody last i lastChar.

    Podczas gdy pozostałe metody odczytu („type read») ładują informacje o bufor serię w tej samej kolejności, w jakiej przybyła (FIFO), w przypadku tych dwóch metod ostatni bajt, który osiągnął bufor seria. Metoda last zwraca wartość ostatniego bajtu jako a int y lastChar zwraca wartość jako a char.

    Zarządzanie buforem szeregowym

    Chociaż dotychczasowe metody są doskonale funkcjonalne, nie zawsze stanowią najlepszy sposób wykorzystania dostępu do portu szeregowego. Aby załadować dane, muszą okresowo sprawdzać stan bufor serii i odczytaj dane dostępne w powtarzającej się części kodu. Ogólnie bardziej skutecznym sposobem jest odczytywanie danych tylko wtedy, gdy wiesz, że są one dostępne.

    Odczyt portu szeregowego po odebraniu danych. Wydarzenie seryjne.

    Aby uzyskać dostęp do bufor serial po odebraniu danych, zdarzenie Serial można wykorzystać, zarządzając nim poprzez definicję metody serialEvent. Ta metoda wykorzystuje port szeregowy, który ją uruchamia, jako argument.

    Rozmiar bufora szeregowego. Metoda buforowa.

    Jeśli znasz liczbę bajtów tworzących blok przydatnych danych, możesz dalej optymalizować ten styl odczytu danych. bufor seria przez serialEvent. Metoda buffer pozwala ustawić liczbę bajtów, które będą przechowywane w pliku bufor przed uruchomieniem wydarzenia seryjnego. Metoda oczekuje jako parametru liczby całkowitej reprezentującej liczbę bajtów.

    Wypełniaj bufor aż do otrzymania wartości. Metoda buforaUntil.

    Zamiast ustawiać wywołanie metody serialEvent dla ilości danych w pliku bufor, przy użyciu metody bufferUntil możesz skonfigurować przechowywanie danych do momentu pojawienia się specjalnej wartości, a następnie wywołać zdarzenie Serial. Parametr przekazywany do tej metody to a int który reprezentuje wartość wygenerowaną przez wywołanie serialEvent.

    Usuń dane zapisane w buforze. Jasna metoda.

    z metodą clear Możesz usunąć dane znajdujące się aktualnie w pliku bufor. Metodą tą można na przykład rozpocząć nową sesję odbioru danych ignorując dane pozostałe z poprzedniej.

    Typowa aplikacja przetwarzająca do odczytu danych przez port szeregowy

    Na koniec wygodnie jest podsumować działanie obiektu Serial de Przetwarzanie które są częściej używane, przechodząc przez typowy przykład odbierania danych przez port szeregowy, aby narysować z nimi wykres, w tym przypadku obszarów skumulowanych.

    Zaimportuj bibliotekę Serial

    Określ protokół danych (separatory)

    Określ obiekt klasy Serial

    Utwórz instancję obiektu klasy Serial, ustawiając używany port szeregowy

    Skonfiguruj bufor portu szeregowego

    Zaimplementuj procedurę obsługi zdarzenia Serial

    Przeczytaj bufor szeregowy

    Kondycjonuj otrzymane dane

    Zakończ komunikację szeregową

    Przykładowy kod poniżej ilustruje to podsumowanie funkcjonalną (choć bardzo prostą) aplikacją, która generuje wykres warstwowy z wartościami odbieranymi przez port szeregowy, coś podobnego do tego, co pokazuje poniższa animacja.

    grafika z przetwarzaniem danych otrzymanych przez port szeregowy

    Aby nie zgubić się w dalszej części programu i skupić uwagę na komunikacji szeregowej Przetwarzanie, podświetlone zostaną linie kodu odpowiadające poprzednim operacjom.

    Zamieść komentarz

    Być może przegapiłeś