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

UART (Universal Asynchronous Receiver-Transmitter) — один из самых распространённых интерфейсов последовательной связи в микроконтроллерах, включая Arduino. Он используется для обмена данными между устройствами без тактового сигнала, что делает его простым и удобным для многих проектов.
В этой статье мы разберём:
UART — это аппаратный модуль (или программная реализация), который преобразует параллельные данные (например, 8-битный байт) в последовательный поток битов и наоборот. Он используется для:
Основные особенности UART:
Асинхронный — не требует тактового сигнала (в отличие от SPI или I2C).
Двунаправленный — передача (TX) и приём (RX) работают независимо.
Гибкие настройки — скорость (самые популярные скорости — 9600 и 115200), биты данных, контроль чётности.
UART передаёт данные по одному проводу (TX → RX) в виде последовательности битов. Рассмотрим формат кадра:

Каждый переданный байт «упаковывается» в кадр:
1. Стартовый бит (0) — сигнализирует о начале передачи.
2. Данные (5–9 бит) — полезная информация (обычно 8 бит).
3. Бит чётности (опционально) — проверка ошибок.
4. Стоп-бит(ы) (1 или 2) — завершает передачу.

Двоичное представление: 01000001
1. Старт: 0
2. Данные: 0 1 0 0 0 0 0 1 (LSB first)
3. Стоп: 1
Бодрейт определяет, сколько бит передаётся за секунду. Общие значения: 9600, 19200, 38400, 115200.
Скорость передачи настраивается в скетче:
```cpp
void setup(){
Serial.begin(9600); // Вот тут указывается скорость
}
void loop(){
}
`
Важно: Оба устройства (передатчик и приёмник) должны использовать одинаковую скорость! Иначе будут приниматься символы с ошибками.
Обычно 8 бит (стандартный размер байта), но бывают и другие варианты.
Проверка ошибок передачи:
Определяет конец кадра. Обычно хватает 1 стоп-бита.
В 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 не хватает (например, для подключения GPS и Bluetooth), используют SoftwareSerial.
```cpp
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
void setup() {
mySerial.begin(9600);
}
void loop() {
mySerial.println("Привет! Это сообщение отправлено через SoftwareSerial");
}
`
Проверьте:
Возможные причины:
Если используете SoftwareSerial, избегайте контактов 0 и 1 (они заняты аппаратным UART). Для удобства рекомендуется использовать соседние пины — 2 и 3, 4 и 5 и т.д.
Если вы всё-таки решили подключать модули к пинам аппаратного UART, то есть одна особенность — при прошивке платы необходимо отключать подключенные модули от пинов D0 и D1, чтобы модули не создавали помех при прошивке.
UART — простой и эффективный способ передачи данных между устройствами. Он используется в Arduino для отладки, подключения модулей и обмена информацией.
Ключевые моменты:
Теперь вы знаете, как работает UART, и сможете использовать его в своих проектах!
Подключите школу к пилоту. Генерируйте КМЖ за 2 минуты, ведите CodeStudio уроки, заказывайте оборудование — всё в одном месте.