Последовательная коммуникация в Arduino: UART, основы и устранение неисправностей
Serial-коммуникация в Arduino: UART, протокол RS232/TTL и программирование
История: от параллельного к последовательному интерфейсу
Ранние микроконтроллеры обменивались данными параллельно — 8 проводов (1 байт). Неудобно: много проводов, искажения на длинных линиях, дорого. Появился последовательный протокол — передача тех же 8 бит по 2–3 проводам (TX, RX, GND).
Последовательный протокол (RS232 / TTL)
Байт преобразуется в последовательный поток сдвиговым регистром (параллельно-последовательный), на приеме — обратное преобразование (последовательно-параллельный).
- Синхронный режим — передача блоками (редко в МК).
- Асинхронный режим (UART) — передача по байту, наиболее распространен. Использует старт- и стоп-биты (фрейминг).
Режимы дуплекса:
- Simplex — только передача (TX)
- Half-duplex — передача ИЛИ прием в данный момент (RS485)
- Full-duplex — одновременная передача и прием (UART, RS232)
Стандарт RS232 использует уровни ±3…±25 В (логическая 1 = отрицательное напряжение). Для совместимости с TTL (0/5В или 0/3,3В) нужен преобразователь уровней — популярный MAX232. Arduino работает на TTL-уровнях, но имеет USB-UART мост для связи с ПК.
Программирование Serial в Arduino
Встроенная библиотека Serial берет на себя протокол. Основные функции:
| Функция | Описание |
|---|---|
Serial.begin(baud) | Инициализация, установка бодрейта (обычно 9600). В setup(). |
Serial.available() | Возвращает число байт в буфере приема. 0 — данных нет, >0 — есть данные. |
Serial.read() | Читает 1 байт из буфера. Возвращает число (0–255). Символ '1' прочитается как 49 (ASCII). |
Serial.print(val) / Serial.println(val) | Отправка данных в Serial Monitor / порт. println добавляет перевод строки. |
Serial.write(val) | Отправка бинарных данных (байт). |
Serial.flush() | Ожидает завершения передачи исходящего буфера (не чистит входной!). |
Serial.readString() | Чтение строки до таймаута. |
Serial.parseInt() | Парсинг целого числа из потока. |
Пример: эхо-сервер (получил — вернул)
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
char incoming = Serial.read(); // читаем байт
Serial.print("Получено: ");
Serial.println(incoming); // выводим как символ
// или как число:
// Serial.println((int)incoming);
}
}
Типичные ошибки и советы
- Разный бодрейт у Arduino и ПК/другого устройства — мусор в мониторе. Проверьте
Serial.begin()и настройку монитора. Serial.read()возвращает int, неchar. Символ '0' = 48. Для цифр:val - '0'.Serial.flush()не очищает входной буфер! Для очистки:while(Serial.available()) Serial.read();- На платах с одним UART (UNO, Nano) пины 0 (RX) и 1 (TX) заняты USB. Для второго порта используйте
SoftwareSerial. - Уровни: Arduino UNO — 5В TTL. ESP32, Arduino Due, MKR — 3,3В. Не соединяйте 5В TX с 3,3В RX без делителя напряжения!
Связанные материалы:
- Программирование PIC18 — пошаговое руководство
- MAX232: конструкция, работа, типы, применение
- 10+ онлайн-инструментов для проектирования схем
- 15 Android-приложений для инженеров-электриков
- Схема хлопушного выключателя на 555 таймере
- Определение номинала сгоревшего резистора (3 метода)
Промышленные технологии
- MQTT против DDS: выбор правильного M2M протокола для IoT
- Industrial IoT коммуникации: 6 проверенных инфраструктурных протоколов
- Понимание направлений передачи данных: от симплекса к полнодуплексной связи
- Оптическая передача данных: использование света для высокопропускной, помехонепроницаемой передачи
- Понимание сетевых протоколов: от физического уровня к продвинутому арбитражу
- Микропроцессоры: эволюция вычислений с запрограммированной памятью
- Бесшовная I2C-интеграция Arduino и Raspberry Pi 2 для IoT-проектов с датчиками
- Беспроводная передача данных по магнитному полю на Arduino с 3D-сенсором Infineon
- Устройство для общения глухосліпых людей с помощью 1Sheeld и Arduino
- Логгер температуры и влажности на Arduino с DHT11 и Ethernet Shield