📌 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.