Gdy mikrokontroler ma porozumieć się z komputerem, modułem GPS albo drugim układem, często wystarczą trzy przewody i prosty interfejs UART. Wyjaśniam, czym dokładnie jest ta komunikacja, jak wygląda pojedyncza ramka danych, czym różni się UART od RS-232 oraz jak uniknąć problemów z połączeniem.
UART w kilku najważniejszych informacjach
- UART to sprzętowy interfejs do asynchronicznej transmisji szeregowej.
- Do podstawowej komunikacji potrzebuje linii TX, RX i wspólnej masy GND.
- Nadajnik i odbiornik muszą mieć takie same ustawienia, między innymi baud rate, liczbę bitów danych i parzystość.
- Popularny format 8N1 oznacza 8 bitów danych, brak kontroli parzystości i 1 bit stopu.
- UART dobrze sprawdza się w połączeniach punkt-punkt, ale nie jest najlepszym wyborem dla wielu urządzeń na jednej magistrali.
UART to sprzętowy tłumacz danych cyfrowych
Skrót UART pochodzi od Universal Asynchronous Receiver-Transmitter, czyli uniwersalnego asynchronicznego nadajnika i odbiornika. W praktyce jest to układ lub blok sprzętowy w mikrokontrolerze, który zamienia dane równoległe na szeregowy strumień bitów i wykonuje operację odwrotną po stronie odbiornika.
Najważniejsze słowo w tej nazwie to „asynchroniczny”. UART nie korzysta ze wspólnej linii zegarowej. Oba urządzenia muszą jednak wcześniej uzgodnić szybkość transmisji i format danych. Odbiornik na podstawie bitu startu rozpoznaje początek znaku, a później próbuje odczytywać kolejne bity w odpowiednich momentach.
Typowe połączenie wykorzystuje linię TX, czyli nadajnik, linię RX, czyli odbiornik, oraz wspólną masę GND. Przewód TX jednego urządzenia łączę z RX drugiego. To drobny szczegół, ale właśnie jego pominięcie jest jednym z najczęstszych powodów, dla których świeżo zbudowany układ nie przesyła żadnych danych.
Trzeba też odróżnić UART od poziomów elektrycznych. UART opisuje sposób kodowania i przesyłania danych, ale sam w sobie nie mówi, czy sygnał ma poziom 3,3 V, 5 V, czy napięcia zgodne ze standardem RS-232. Nie każde urządzenie oznaczone jako „serial” można połączyć bezpośrednio.
Jak wygląda transmisja jednego znaku
W stanie spoczynku linia UART zwykle znajduje się w stanie wysokim. Transmisję rozpoczyna bit startu, najczęściej ustawiany jako stan niski. Po nim pojawiają się bity danych, opcjonalny bit parzystości oraz jeden lub więcej bitów stopu.
Popularne ustawienie 115200 8N1 należy czytać następująco: 115200 bitów na sekundę, 8 bitów danych, brak bitu parzystości i 1 bit stopu. Przy takim formacie jeden bajt zajmuje łącznie 10 bitów, ponieważ oprócz 8 bitów danych dochodzi bit startu i bit stopu. Teoretycznie daje to około 11 520 bajtów na sekundę, bez uwzględniania przerw i narzutów programu.
Parametr baud rate, często nazywany po prostu prędkością transmisji, musi być zgodny po obu stronach. W projektach hobbystycznych spotykam najczęściej wartości 9600, 19200, 38400 i 115200. Wyższa szybkość nie zawsze oznacza lepsze działanie. Długie przewody, zakłócenia, niedokładny zegar mikrokontrolera albo słabe konwertery mogą sprawić, że przy dużej prędkości pojawią się błędne znaki.
Bit parzystości może służyć do wykrywania części prostych błędów transmisji, ale nie naprawia uszkodzonych danych. Jeśli aplikacja przesyła ważne polecenia, dokładam własny mechanizm kontroli, na przykład sumę kontrolną, numer ramki lub kod CRC. Sama poprawna konfiguracja UART nie gwarantuje integralności całego komunikatu.
Gdzie wykorzystuje się UART
UART jest popularny, ponieważ zajmuje mało zasobów i łatwo go uruchomić. W mikrokontrolerach takich jak Arduino, STM32, ESP32 czy AVR może służyć do komunikacji z komputerem, modułem GPS, modemem, czujnikiem albo innym kontrolerem.

UART sprawdza się tam, gdzie liczy się prostota
Jednym z najbardziej praktycznych zastosowań jest konsola diagnostyczna. Program wysyła przez UART komunikaty o stanie urządzenia, a inżynier obserwuje je w terminalu na komputerze. W ten sposób można sprawdzić, czy mikrokontroler uruchomił konkretny moduł, odebrał polecenie albo wykonał daną funkcję.
Interfejs przydaje się również przy modułach GPS i Bluetooth. Moduł GPS może wysyłać pozycję w postaci tekstowych komunikatów, a moduł Bluetooth często udostępnia bezprzewodowe połączenie, pozostawiając UART jako prosty interfejs po stronie mikrokontrolera. W praktyce UART staje się wtedy mostem między programem a zewnętrznym urządzeniem.
Wiele płytek rozwojowych korzysta z układu USB-UART. Komputer komunikuje się przez USB, konwerter zamienia dane na sygnały UART, a te trafiają do mikrokontrolera. Dlatego port USB na płytce nie zawsze oznacza, że sam mikrokontroler obsługuje USB. Często komputer widzi w systemie wirtualny port szeregowy, a wewnątrz płytki działa właśnie most USB-UART.
UART bywa też używany przez bootloadery, czyli programy uruchamiane przed właściwym firmware. Pozwala wtedy wgrać nowe oprogramowanie bez specjalnego programatora. To wygodne rozwiązanie, choć w gotowym produkcie zwykle trzeba zabezpieczyć dostęp do interfejsu, aby przypadkowa osoba nie mogła zmienić oprogramowania urządzenia.
UART, RS-232, I2C i SPI to nie to samo
Te nazwy często występują obok siebie, ale opisują różne elementy systemu komunikacji. Największe nieporozumienie dotyczy RS-232. UART definiuje sposób przesyłania bitów, a RS-232 określa między innymi poziomy napięć i sposób elektrycznego podłączenia. Do połączenia mikrokontrolera z prawdziwym portem RS-232 potrzebny jest odpowiedni konwerter, a nie sam przewód.
| Interfejs | Zegar | Liczba urządzeń | Typowe zastosowanie |
|---|---|---|---|
| UART | Brak wspólnej linii zegarowej | Zwykle dwa urządzenia | Debugowanie, GPS, modemy, moduły radiowe |
| I2C | Wspólny zegar SCL | Wiele urządzeń na dwóch liniach | Czujniki, ekspandery, układy sterujące |
| SPI | Wspólny zegar | Wiele urządzeń, zwykle z osobnym CS | Pamięci, wyświetlacze, szybkie przetworniki |
| RS-232 | Brak wspólnej linii zegarowej | Zwykle połączenie punkt-punkt | Starsze komputery, sterowniki i urządzenia przemysłowe |
Jeśli potrzebuję połączyć jeden mikrokontroler z jednym modułem, UART jest zwykle najprostszym wyborem. Gdy kilka czujników ma współdzielić te same przewody, częściej wybieram I2C. SPI wygrywa wtedy, gdy ważna jest większa przepustowość i nie przeszkadza mi dodatkowa linia wyboru dla każdego urządzenia.
Jak uruchomić połączenie UART bez zgadywania
Przy pierwszym uruchomieniu zaczynam od dokumentacji obu urządzeń. Sprawdzam poziom napięcia, numer użytego UART-u, funkcję pinów oraz domyślne parametry transmisji. Nie zakładam, że pin opisany jako RX będzie miał takie samo znaczenie na każdej płytce, bo czasem oznaczenia odnoszą się do perspektywy modułu, a czasem do urządzenia nadrzędnego.
- Połącz TX pierwszego urządzenia z RX drugiego.
- Połącz RX pierwszego urządzenia z TX drugiego.
- Połącz masy GND obu układów.
- Ustaw identyczny baud rate, liczbę bitów danych, parzystość i liczbę bitów stopu.
- Upewnij się, że poziomy logiczne są zgodne, na przykład 3,3 V z 3,3 V.
- Wyślij krótki, łatwy do rozpoznania komunikat, na przykład „TEST”.
Jeśli terminal pokazuje przypadkowe znaki, najpierw sprawdzam prędkość i format ramki. Następnie kontroluję skrzyżowanie TX i RX oraz wspólną masę. Dopiero później podejrzewam uszkodzenie modułu. W większości prostych przypadków problem wynika z konfiguracji albo przewodów, nie z wadliwego UART-u.
Poziomy napięć mają znaczenie
Wyjście 5 V może uszkodzić wejście pracujące wyłącznie z napięciem 3,3 V. W drugą stronę sygnał 3,3 V nie zawsze zostanie poprawnie rozpoznany przez układ 5 V. Stosuję wtedy konwerter poziomów logicznych albo dzielnik napięcia, jeśli dotyczy to wyłącznie jednokierunkowego sygnału i zakres częstotliwości na to pozwala.
Przeczytaj również: Interfejs I2C - Jak działa, jak podłączyć i unikać błędów?
Gdy dane znikają tylko czasami
Okresowe błędy mogą wskazywać na zakłócenia, zbyt długie przewody, różne częstotliwości zegarów albo przepełnienie bufora odbiorczego. W takim przypadku ograniczam prędkość, skracam połączenie i sprawdzam, czy program odbiera dane w przerwaniach lub przez DMA. Analizator stanów logicznych potrafi szybko pokazać, czy problem pojawia się już na przewodzie, czy dopiero w kodzie.
Kiedy lepiej wybrać inny interfejs
UART nie jest uniwersalnym rozwiązaniem do każdej komunikacji. Najlepiej działa przy krótkim, prostym połączeniu punkt-punkt, gdy oba urządzenia mają jasno ustalone ustawienia. Nie zapewnia automatycznego adresowania wielu odbiorników, dlatego podłączenie kilku modułów do jednej linii wymaga dodatkowego protokołu albo innego interfejsu.
Przy większych odległościach sam sygnał TTL lub CMOS może być podatny na zakłócenia. W instalacjach przemysłowych stosuje się często transceivery RS-485, które pozwalają budować odporniejsze połączenia różnicowe. To nadal może być komunikacja oparta na formacie UART, ale warstwa elektryczna jest już inna.
Do przesyłania dużych ilości danych w krótkim czasie lepsze mogą być SPI, USB albo dedykowane interfejsy o większej przepustowości. Z kolei do prostych komunikatów sterujących UART często wygrywa niewielką liczbą przewodów i łatwością debugowania. Najlepszy wybór zależy od odległości, liczby urządzeń, szybkości transmisji i odporności wymaganej przez projekt.
Najważniejsza zasada przy pierwszym połączeniu UART
UART można sprowadzić do prostej idei: dwa urządzenia przesyłają sobie dane bit po bicie bez wspólnego zegara, korzystając z wcześniej uzgodnionego formatu. Jeśli zapamiętam skrzyżowanie TX z RX, wspólną masę, zgodne poziomy napięć i identyczne ustawienia transmisji, rozwiązuję większość problemów jeszcze przed uruchomieniem kodu.
Właśnie dlatego ten interfejs nadal tak dobrze sprawdza się w elektronice, robotyce i systemach wbudowanych. Nie jest najszybszy ani najbardziej rozbudowany, ale oferuje coś bardzo praktycznego: prostą, tanią i łatwą do obserwowania komunikację między urządzeniami.