Коротка довідка, написана після того, як я роками користувався двома проводами і думав, що це і є UART. А потім подивився на розпіновку UART4 на Luckfox Pico Pro і побачив там чотири сигнали: TX, RX, CTS, RTS. І зрозумів, що знав не всю картину.
Коротка відповідь
| Скільки дротів | Що це | Коли потрібно |
|---|---|---|
| 2 | TX, RX — UART як протокол | Підручники, формально |
| 3 | + GND | Реальний зв’язок між пристроями |
| 4 | + CTS, RTS (hardware flow control) | Високі швидкості, GSM, Bluetooth, RS-232 |
| 5 | + VCC (живлення) | USB-TTL адаптер живить плату від USB |
Рівень 1 — два дроти (TX, RX): UART як ідея
UART у чистому вигляді — це два сигнальні дроти. Один передає (TX), інший приймає (RX). З’єднання — навхрест: TX однієї плати йде в RX іншої, і навпаки.
|
1 2 3 |
Плата А Плата Б TX ──────────────► RX RX ◄────────────── TX |
Це і вся «логіка» протоколу. У підручниках UART зазвичай саме так і малюють.
Рівень 2 — три дроти (TX, RX, GND): реальний зв’язок
Щоб дві плати справді поговорили, їм потрібна спільна точка відліку. «Високий рівень 3.3 В» нічого не означає, якщо у плат немає спільного нуля — спільної землі. Тому до TX і RX додається GND.
|
1 2 3 4 |
Плата А Плата Б TX ──────────────► RX RX ◄────────────── TX GND ─────────────── GND |
Коли можна обійтися без окремого GND-дроту: якщо обидві плати живляться від спільного джерела (один USB-хаб, спільний блок живлення, спільна материнська плата) — у них уже є спільна земля через живлення. Саме тому багато любительських схем «на двох дротах» працюють — третій дріт там фактично є, просто не через UART-роз’єм.
⚠ Граблина. Як тільки плати живляться окремо — без явного GND між ними обмін стає нестабільним, з’являються спотворені байти, у крайньому випадку можна пошкодити пін. Якщо не впевнений у спільній землі — додай GND явно.
Рівень 3 — чотири дроти (+ CTS, RTS): апаратний контроль потоку
А ось тут починається те, чого в більшості любительських проєктів немає, і про що довго не дізнаєшся.
Hardware flow control — це механізм «зачекай / можна», доданий до UART. Уяви розмову, де один говорить швидко, а другий не встигає записувати. Без сигналу «пригальмуй» — частина слів пропаде. RTS і CTS — це і є той сигнал.
RTS (Request To Send) — «у мене є що передати, готовий писати». CTS (Clear To Send) — «давай, я готовий приймати».
|
1 2 3 4 5 6 |
Плата А Плата Б TX ──────────────► RX RX ◄────────────── TX RTS ──────────────► CTS CTS ◄────────────── RTS GND ─────────────── GND |
Перед тим як кинути порцію даних у TX, передавач смикає RTS і дивиться на CTS приймача. Зайнятий — чекає. Готовий — передає. Жодного байта не губиться.
Коли воно реально потрібне
Більшість любительських сценаріїв на 9600, 19200, 38400 baud живуть без CTS/RTS — приймачі встигають. Я й сам роками так працював. Але є випадки, де воно стає в пригоді:
- Високі швидкості — 115200 і вище, особливо ближче до мегабіта. Найменша затримка приймача (переривання, навантажене ядро) — і байт зник.
- Bluetooth-модулі по UART — HC-05, BLE, повноцінні Bluetooth Classic. Радіоканал ловить нерівномірно, модуль мусить мати чим сказати «припини, у мене черга».
- GSM/4G-модулі — те саме, мережа підкидає сплески даних.
- Embedded Linux ↔ MCU — у Linux UART може зависнути на десятки мілісекунд під час навантаженого моменту ядра. Без CTS/RTS саме там байти зникають.
- RS-232 з реальним modem-чипом — там CTS/RTS були в стандарті з самого початку.
Чому Luckfox Pico Pro розводить усі чотири
Luckfox — повноцінний Linux-комп’ютер, і його UART4 спроєктований з прицілом на «дорослі» сценарії: GSM, високошвидкісний радіомодуль, серйозний обмін з MCU. Тому всі чотири лінії — у розпіновці. Якщо підключаєш простий STM32 на 115200 — використовуй TX, RX, GND, а CTS/RTS лиши неприєднаними. Коли колись будеш чіпляти модем — розведеш ці дві лінії, і не загубиш ані байта.
Рівень 4 — п’ятий дріт (VCC): зручність USB-TTL адаптера
На USB-TTL адаптерах (CH340, FT232, CP2102) на роз’ємі часто 5 виводів: TX, RX, GND, RTS і VCC (3.3 В або 5 В).
VCC до UART не має жодного стосунку. Це бонус від адаптера — щоб він міг живити плату-співрозмовника від USB. Зручно для розробки: запхав адаптер у комп’ютер, плата ожила, можна шити. На повноцінних платах з власним живленням цей п’ятий провід просто не підключають.
⚠ Граблина. Не плутай VCC з сигнальною лінією. Якщо помилково подати VCC замість сигналу — спалиш пін.
Шпаргалка для типових випадків
| Сценарій | Дроти |
|---|---|
| Blue Pill ↔ USB-TTL для відладки | TX, RX, GND (+VCC опційно) |
| STM32 ↔ Luckfox, 115200 baud | TX, RX, GND |
| GSM-модуль SIM800 / SIM7600 на 921600 | TX, RX, GND, CTS, RTS |
| Bluetooth-модуль HC-05 | TX, RX, GND (CTS/RTS бажано) |
| Прошивка ESP8266/ESP32 через USB-TTL | TX, RX, GND, EN, IO0 (це вже не UART, це bootloader) |
| Два STM32 між собою, 9600 baud | TX, RX, GND |
Висновок
UART — це протокол на двох лініях. UART як електричний зв’язок — три проводи. UART з апаратним контролем потоку — чотири. Усе, що понад — або живлення (зручність), або вже не UART (як IO0 для ESP).
Якщо роками працював на двох дротах і все було добре — значить, у тебе було спільне живлення (третій провід неявно), низькі швидкості (CTS/RTS не потрібен) і прості пристрої (модемів і Bluetooth не чіпляв). Це не помилка — це робочий любительський сценарій. Просто тепер ти знаєш, де ховаються ще два проводи, і коли їх варто згадати.