Все статьиПрограммирование

Как работает UART (интерфейс общения устройств)? Подробное руководство для Arduino и электроники

БА
Бексултан Айтен
CTO, Alashed
3 августа 2025 г.
8 мин чтения
Как работает UART (интерфейс общения устройств)? Подробное руководство для Arduino и электроники

Разбираем работу UART — асинхронного интерфейса последовательной связи: структура кадра, бодрейт, биты чётности, аппаратный и программный UART в Arduino, примеры кода и распространённые проблемы.

В этой статье рассмотрим, как работает интерфейс общения микроконтроллеров — UART. Начинаем!

Пример соединения двух плат по UART
Пример соединения двух плат по UART

UART (Universal Asynchronous Receiver-Transmitter) — один из самых распространённых интерфейсов последовательной связи в микроконтроллерах, включая Arduino. Он используется для обмена данными между устройствами без тактового сигнала, что делает его простым и удобным для многих проектов.

В этой статье мы разберём:

  • Что такое UART и зачем он нужен?
  • Принцип работы UART (асинхронная передача данных)
  • Скорость передачи (бодрейт), стоп-биты, биты чётности
  • Аппаратный и программный UART в Arduino
  • Примеры кода для работы с UART
  • Распространённые проблемы и их решение

1. Что такое UART и зачем он нужен?

UART — это аппаратный модуль (или программная реализация), который преобразует параллельные данные (например, 8-битный байт) в последовательный поток битов и наоборот. Он используется для:

  • Обмена данными между микроконтроллерами (Arduino, ESP, STM32 и др.)
  • Подключения датчиков (GPS, Bluetooth-модули, MP3 Module)
  • Общение с платой через компьютер, с помощью Serial Monitor в Arduino IDE
  • Программирование микроконтроллеров через программаторы USB-UART (например, CH340)

Основные особенности UART:

Асинхронный — не требует тактового сигнала (в отличие от SPI или I2C).

Двунаправленный — передача (TX) и приём (RX) работают независимо.

Гибкие настройки — скорость (самые популярные скорости — 9600 и 115200), биты данных, контроль чётности.

2. Как работает UART? Асинхронная передача данных

UART передаёт данные по одному проводу (TX → RX) в виде последовательности битов. Рассмотрим формат кадра:

Структура UART-кадра
Структура UART-кадра

Структура UART-кадра

Каждый переданный байт «упаковывается» в кадр:

1. Стартовый бит (0) — сигнализирует о начале передачи.

2. Данные (5–9 бит) — полезная информация (обычно 8 бит).

3. Бит чётности (опционально) — проверка ошибок.

4. Стоп-бит(ы) (1 или 2) — завершает передачу.

Вот так выглядит сигнал по UART передаче буквы «А»
Вот так выглядит сигнал по UART передаче буквы «А»

Пример передачи символа 'A' (0x41 в ASCII)

Двоичное представление: 01000001

1. Старт: 0

2. Данные: 0 1 0 0 0 0 0 1 (LSB first)

3. Стоп: 1

3. Настройки UART: скорость, биты данных, контроль чётности

Скорость передачи (бодрейт, Baud Rate)

Бодрейт определяет, сколько бит передаётся за секунду. Общие значения: 9600, 19200, 38400, 115200.

Скорость передачи настраивается в скетче:

```cpp

void setup(){

Serial.begin(9600); // Вот тут указывается скорость

}

void loop(){

}

`

Важно: Оба устройства (передатчик и приёмник) должны использовать одинаковую скорость! Иначе будут приниматься символы с ошибками.

Биты данных (5–9 бит)

Обычно 8 бит (стандартный размер байта), но бывают и другие варианты.

Бит чётности (Parity Bit)

Проверка ошибок передачи:

  • None — без проверки (чаще всего).
  • Even — чётное число единиц.
  • Odd — нечётное число единиц.

Стоп-биты (1 или 2)

Определяет конец кадра. Обычно хватает 1 стоп-бита.

4. Аппаратный и программный UART в Arduino

Аппаратный UART (Hardware Serial)

В Arduino Uno (ATmega328P) есть один аппаратный UART (контакты 0 (RX) и 1 (TX)).

Пример кода:

```cpp

void setup() {

Serial.begin(9600); // Инициализация UART на скорости 9600 бод

}

void loop() {

Serial.println("Hello, UART!"); // Отправка данных

if (Serial.available()) {

char data = Serial.read(); // Чтение данных

}

}

`

Программный UART (SoftwareSerial)

Если аппаратных UART не хватает (например, для подключения GPS и Bluetooth), используют SoftwareSerial.

```cpp

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup() {

mySerial.begin(9600);

}

void loop() {

mySerial.println("Привет! Это сообщение отправлено через SoftwareSerial");

}

`

5. Распространённые проблемы и их решение

1. Нет данных в Serial Monitor

Проверьте:

  • Скорость передачи (должна совпадать в коде и мониторе).
  • Правильно ли подключены RX и TX (перекрёстно: TX (выход) → RX (вход), RX (вход) → TX (выход)).

2. Мусор в данных

Возможные причины:

  • Разный бодрейт.
  • Помехи в линии (используйте экранированные провода), обычно нормально работают обычные провода для макетных плат.

3. Конфликт аппаратного и программного UART

Если используете SoftwareSerial, избегайте контактов 0 и 1 (они заняты аппаратным UART). Для удобства рекомендуется использовать соседние пины — 2 и 3, 4 и 5 и т.д.

4. Особенность использования аппаратного UART

Если вы всё-таки решили подключать модули к пинам аппаратного UART, то есть одна особенность — при прошивке платы необходимо отключать подключенные модули от пинов D0 и D1, чтобы модули не создавали помех при прошивке.

Заключение

UART — простой и эффективный способ передачи данных между устройствами. Он используется в Arduino для отладки, подключения модулей и обмена информацией.

Ключевые моменты:

  • UART работает асинхронно (без тактового сигнала).
  • Важно правильно настроить скорость передачи (бодрейт).
  • В Arduino есть аппаратный и программный UART.

Теперь вы знаете, как работает UART, и сможете использовать его в своих проектах!

Попробуйте Alashed бесплатно

Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.

Попробовать бесплатноДемо