Введение
Последовательная связь — один из самых фундаментальных навыков во встраиваемой электронике. Отлаживаете ли вы датчик, общаетесь с GPS-модулем или отправляете данные на ПК — скромный USART (универсальный синхронный/асинхронный приёмопередатчик) будет вашим незаменимым инструментом. В этом руководстве мы создадим простой проект последовательного эха с использованием Arduino Uno в симуляторе Velxio. Каждый символ, который вы вводите в мониторе последовательного порта, возвращается обратно с его ASCII-значением и счётчиком. Это «Hello, World!» последовательной связи.

Обзор схемы
Этот проект удивительно прост — он использует только саму плату Arduino Uno. Никаких внешних компонентов не требуется, так как последовательная связь осуществляется через встроенный в Uno преобразователь USB-в-последовательный порт. В Velxio монитор последовательного порта встроен в панель инструментов редактора, поэтому вы можете сразу взаимодействовать с кодом.
Компоненты
| Компонент | Количество | Примечания |
|---|---|---|
| Arduino Uno (wokwi-arduino-uno) | 1 | Мозг операции |
Вот и всё! Вывод TX (пин 1) и вход RX (пин 0) Arduino Uno внутренне подключены к интерфейсу USB, который Velxio идеально эмулирует. Никаких соединений не требуется.

Разбор кода
Давайте погрузимся в код. Откройте редактор Velxio, и вы увидите следующий скетч:
// Serial Echo — USART Protocol Test
// Open the Serial Monitor to send and receive data.
// Everything you type is echoed back with extra info.
void setup() {
Serial.begin(9600);
Serial.println("=============================");
Serial.println(" Serial Echo Test (USART)");
Serial.println("=============================");
Serial.println("Type something and press Send.");
Serial.println();
// Print system info
Serial.print("CPU Clock: ");
Serial.print(F_CPU / 1000000);
Serial.println(" MHz");
Serial.print("Baud rate: 9600");
Serial.println();
Serial.println();
}
unsigned long charCount = 0;
void loop() {
if (Serial.available() > 0) {
char c = Serial.read();
charCount++;
Serial.print("[");
Serial.print(charCount);
Serial.print("] Received: '");
Serial.print(c);
Serial.print("' (ASCII ");
Serial.print((int)c);
Serial.println(")");
}
// Periodic heartbeat
static unsigned long lastBeat = 0;
if (millis() - lastBeat >= 5000) {
lastBeat = millis();
Serial.print("Uptime: ");
Serial.print(millis() / 1000);
Serial.print("s | Chars received: ");
Serial.println(charCount);
}
}

Как это работает
-
Setup: Мы инициализируем последовательную связь на скорости 9600 бод с помощью
Serial.begin(9600). Затем выводим заголовок и системную информацию: тактовую частоту CPU (F_CPU / 1000000 даёт МГц) и скорость передачи. -
Глобальная переменная:
unsigned long charCount = 0;отслеживает количество полученных символов. -
Loop:
if (Serial.available() > 0)проверяет, есть ли данные в буфере приёма.char c = Serial.read();считывает один символ.- Мы увеличиваем
charCountи выводим форматированное сообщение:[count] Received: 'c' (ASCII 99). - Каждые 5 секунд выводится «сердцебиение» с временем работы и общим количеством полученных символов.
Ключевые понятия для студентов
- Скорость передачи (Baud Rate): Скорость последовательной связи. Обе стороны должны согласовать одну и ту же скорость (здесь 9600).
- Serial.available(): Возвращает количество байт, ожидающих чтения. Всегда проверяйте перед чтением, чтобы избежать получения -1.
- Serial.read(): Читает один байт (символ) из буфера.
- ASCII: Каждый символ имеет числовой код. Например, ‘A’ — это 65. В коде выполняется приведение
cкint, чтобы показать это. - millis(): Возвращает количество миллисекунд с момента запуска программы. Полезно для неблокирующей синхронизации.
- Статические переменные:
static unsigned long lastBeatсохраняет своё значение между итерациями цикла, в отличие от локальных переменных.
Частые ошибки и советы по отладке
- Монитор порта не показывает вывод? Убедитесь, что вы открыли монитор последовательного порта в Velxio (нажмите кнопку «Serial Monitor» на панели инструментов). Также проверьте, что скорость в мониторе соответствует 9600.
- Мусорные символы? Несовпадение скорости передачи — самая частая причина. Перепроверьте
Serial.begin(9600)и настройки монитора. - Ничего не происходит при вводе? Убедитесь, что вы нажимаете «Send» или Enter после ввода. Код читает по одному символу за раз.
- Не выводится сердцебиение? Условие
if (millis() - lastBeat >= 5000)использует>=, чтобы не пропустить интервал. Если сердцебиения нет, проверьте, правильно ли обновляетсяlastBeat.
Предлагаемые расширения
Когда вы освоите базовое эхо, попробуйте эти улучшения:
- Эхо целых строк: Вместо вывода каждого символа накапливайте символы до символа новой строки, затем выводите всю строку.
- Парсер команд: Интерпретируйте специальные команды, например «LED ON», чтобы включить светодиод (добавьте светодиод в схему).
- Двоичный вывод: Выводите полученный символ в двоичном формате.
- Несколько скоростей передачи: Позвольте пользователю менять скорость передачи с помощью команды.
- Запись в виртуальную EEPROM: Сохраняйте полученные данные в симулированной EEPROM.
Заключение
Вы только что создали свой первый проект последовательной связи! Последовательное эхо — это простая, но мощная демонстрация того, как микроконтроллеры общаются с внешним миром. С Velxio вы можете экспериментировать без какого-либо оборудования — просто откройте симулятор, пишите код и тестируйте мгновенно.
Готовы попробовать сами? Откройте живой пример в Velxio и начните вводить текст: Serial Echo на Velxio. Удачного кодирования!