📌 UART
UART (Universal Asynchronous Receiver/Transmitter, универсальный асинхронный приёмопередатчик) — базовый аппаратный модуль для асинхронного последовательного обмена данными между электронными устройствами. Применяется для обмена данными по простейшим двухпроводным интерфейсам: TX (передача) и RX (приём), иногда с поддержкой дополнительных сигналов управления (RTS, CTS, DTR, DSR).
🧠 Как работает
Принцип передачи
- Асинхронный обмен: нет общего тактового сигнала, передача/приём синхронизируются по старт/стоп-битам и согласованной скорости (baudrate).
- Формат фрейма: последовательность битов включает старт-бит, 5–9 информационных бит, необязательный бит чётности (parity), 1–2 стоп-бита.
- Скорость: поддержка типовых скоростей 300–115200 бод и выше (до Mbaud в современных UART-IP).
- Буферизация: обычно аппаратные FIFO-буферы (TX FIFO, RX FIFO) для сглаживания пиков передачи и уменьшения загрузки CPU.
- Прерывания: сигнализация о событиях передачи/приёма через IRQ, возможен режим DMA.
Базовая схема работы UART
flowchart TB CPU["CPU / MCU"] UART["UART"] TX["TX (Transmit)"] RX["RX (Receive)"] Device["Внешнее устройство (например, ПК, модем, контроллер)"] CPU --> UART UART --> TX UART <-- RX TX --> Device Device --> RX
Подробности:
-
Передача: CPU или DMA кладёт байт в TX FIFO; UART формирует последовательность бит (start, data, parity, stop) и выдаёт их на линию TX.
-
Приём: UART отслеживает старт-бит, считывает битовую последовательность на RX, восстанавливает байт в RX FIFO, сигнализирует CPU по IRQ или polling.
-
Управляющие сигналы: RTS, CTS, DTR, DSR применяются для аппаратного управления потоком (flow control).
⚙️ Где применяется
-
Микроконтроллеры, SoC, платы разработки: стандартный интерфейс для отладки, загрузки прошивок, обмена с датчиками, внешними контроллерами, принтерами, GPS-модулями, модемами.
-
Промышленные системы: PLC, ЧПУ, SCADA, модемы, шлюзы.
-
Периферия ПК: классические COM-порты (RS232), диагностические консоли, POS-терминалы.
-
Встраиваемые и IoT: роутеры, модули связи, консольные интерфейсы.
-
Радиомодули, GSM/LTE, Bluetooth: обмен с модулями связи, AT-команды, debug.
✅ Преимущества
-
Простота: минимальное количество линий (2–4 для полной работы).
-
Дешевизна и распространённость: реализуется во всех современных MCU, SoC, FPGA, периферии.
-
Асинхронность: не требует внешнего тактового сигнала.
-
Гибкость: широкий диапазон скоростей и конфигурируемых параметров.
-
Совместимость: поддерживается практически всеми платформами и ОС.
❌ Недостатки
-
Нет встроенной адресации или маршрутизации: работает только точка-точка или через внешние мультиплексоры.
-
Ограниченная скорость: уступает SPI, I2C, USB и др. по пропускной способности.
-
Ограниченная надёжность: возможна потеря данных при несовпадении скоростей или отсутствии flow control.
-
Чувствительность к помехам: особенно на длинных линиях (решается с помощью RS232, RS485 уровней).
🔗 Связанные технологии
CPU, MCU, SoC, DMA, IRQ, SPI, I2C, USB, RS232, RS485, Modem, FPGA, RTS, CTS, DTR, DSR
Резюме
UART — фундаментальный интерфейс для асинхронной последовательной передачи данных между микросхемами и устройствами. Отличается простотой, дешевизной и универсальностью, но ограничен по скорости и адресации. Широко применяется во встраиваемых, промышленныx, IoT и отладочных системах для обмена, управления, диагностики и связи.
Примеры кода
C (baremetal): инициализация и передача символа через UART
#define UART0_BASE 0x3F201000
#define UART0_DR (*(volatile unsigned int*)(UART0_BASE + 0x00))
#define UART0_FR (*(volatile unsigned int*)(UART0_BASE + 0x18))
void uart_send(char c) {
while (UART0_FR & (1 << 5)); // Ждём освобождения FIFO
UART0_DR = c;
}
Linux: работа с UART из пользовательского пространства
#include <fcntl.h>
#include <unistd.h>
int fd = open("/dev/ttyS0", O_WRONLY | O_NOCTTY);
write(fd, "Hello UART\n", 11);
close(fd);
Python (pyserial): отправка строки через UART
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200)
ser.write(b'Hello UART\n')
ser.close()
Настройка скорости и режима в терминале Linux
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb
cat /dev/ttyUSB0
Источники: ARM Cortex-M Tech Ref, STMicroelectronics UART Reference, Silicon Labs App Notes, Linux Serial HOWTO, osdev.org, Википедия, habr.com, Arduino docs.