UART — два, три чи чотири проводи?

Коротка довідка, написана після того, як я роками користувався двома проводами і думав, що це і є 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 іншої, і навпаки.

Це і вся «логіка» протоколу. У підручниках UART зазвичай саме так і малюють.


Рівень 2 — три дроти (TX, RX, GND): реальний зв’язок

Щоб дві плати справді поговорили, їм потрібна спільна точка відліку. «Високий рівень 3.3 В» нічого не означає, якщо у плат немає спільного нуля — спільної землі. Тому до TX і RX додається GND.

Коли можна обійтися без окремого GND-дроту: якщо обидві плати живляться від спільного джерела (один USB-хаб, спільний блок живлення, спільна материнська плата) — у них уже є спільна земля через живлення. Саме тому багато любительських схем «на двох дротах» працюють — третій дріт там фактично є, просто не через UART-роз’єм.

Граблина. Як тільки плати живляться окремо — без явного GND між ними обмін стає нестабільним, з’являються спотворені байти, у крайньому випадку можна пошкодити пін. Якщо не впевнений у спільній землі — додай GND явно.


Рівень 3 — чотири дроти (+ CTS, RTS): апаратний контроль потоку

 

А ось тут починається те, чого в більшості любительських проєктів немає, і про що довго не дізнаєшся.

Hardware flow control — це механізм «зачекай / можна», доданий до UART. Уяви розмову, де один говорить швидко, а другий не встигає записувати. Без сигналу «пригальмуй» — частина слів пропаде. RTS і CTS — це і є той сигнал.

RTS (Request To Send) — «у мене є що передати, готовий писати». CTS (Clear To Send) — «давай, я готовий приймати».

Перед тим як кинути порцію даних у 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 не чіпляв). Це не помилка — це робочий любительський сценарій. Просто тепер ти знаєш, де ховаються ще два проводи, і коли їх варто згадати.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *