Serial Call and Response с ASCII-кодированием:握手-протокол между Arduino и компьютером
Передача нескольких переменных через последовательный порт с использованием метода запрос-ответ (handshaking) и ASCII-кодирования значений.
В этом уроке разберём строковый способ обмена данными между Arduino и компьютером по протоколу «запрос-ответ» (call-and-response, или handshaking). Такой подход гарантирует, что Arduino не будет «стрелять» данными вхолостую — она отправляет новую порцию значений только тогда, когда компьютер явно попросит об этом.
При старте скетч посылает ASCII-строку и повторяет её до тех пор, пока не получит ответ от компьютера. После «рукопожатия» Arduino начинает отправлять три значения датчиков в виде ASCII-чисел, разделённых запятыми и завершённых символами перевода строки (\n) и возврата каретки (\r). Затем она снова ждёт запроса.
Посмотреть отправляемые данные можно прямо в Serial Monitor Arduino IDE. Кроме того, их легко принять в Processing, Flash, PD, Max/MSP и других средах — примеры для Processing и Max/MSP приведены ниже.
Чем этот пример отличается от обычного Serial Call and Response
Сравните этот урок с Serial call and response example. Оба используют handshaking, но здесь значения датчиков кодируются как ASCII-строки, а не передаются как сырые байты. Это даёт два важных преимущества:
- Значения больше 255 — ASCII-строка легко вмещает любое число, тогда как один байт ограничен диапазоном 0–255.
- Читаемость — данные можно открыть в любом терминале и сразу увидеть осмысленные числа, а не загадочные байты.
Плата за это — чуть больший объём трафика: число 1023 занимает 4 байта в ASCII против 2 байт в бинарном виде. Для большинства задач это несущественно.
Необходимое оборудование
- Arduino Board
- 2 аналоговых датчика (потенциометр, фоторезистор, датчик давления FSR и т. п.)
- тактовая кнопка
- 3 резистора по 10 кОм
- провода-перемычки
- макетная плата
Необходимое программное обеспечение
Схема подключения
Подключите аналоговые датчики к пинам A0 и A1 через резисторы 10 кОм, образующие делители напряжения. Кнопку или переключатель подключите к цифровому пину 2 с резистором 10 кОм на GND (подтяжка к земле).

Схема подключения Arduino UNO к макетной плате с двумя датчиками давления и кнопкой
Принципиальная схема

На схеме: два датчика-резистора подключены к A0 и A1, два резистора 10 кОм формируют делители напряжения, кнопка с резистором 10 кОм — на пине 2
Код
Как это работает
- При включении Arduino отправляет строку-«маяк» и ждёт ответного байта от компьютера.
- Получив ответ, она считывает значения с
A0,A1и состояние кнопки на пине2, формирует строку вида512,768,1\r\nи отправляет её. - После отправки Arduino снова замолкает и ждёт следующего запроса.
- Принимающая сторона (Processing, Max/MSP и т. д.) разбивает строку по запятым, преобразует фрагменты в числа и использует их по назначению.
Код для Processing
Скопируйте Processing-скетч из примера выше. По мере изменения аналогового датчика на экране будет перемещаться шарик — примерно так, как показано ниже. Шарик появляется только при нажатой кнопке:

Окно Processing-скетча SerialCallResponse: белый круг на чёрном фоне реагирует на положение датчиков
Код для Max/MSP
Патч Max/MSP выглядит следующим образом. Скопируйте текст из примера выше и вставьте его в новое окно Max:

Патч Max/MSP считывает данные с Arduino через последовательный порт и отображает круг, координаты и цвет которого задаются тремя значениями датчиков. Патч ждёт байт 65 (ASCII A) при старте, а затем отправляет ASCII A каждый раз, когда нужны новые данные.
Типичные ошибки и отладка
- Ничего не приходит в Serial Monitor — убедитесь, что скорость порта в мониторе совпадает с той, что указана в
Serial.begin()скетча. - Данные приходят один раз и останавливаются — скорее всего, принимающая сторона не отправляет ответный байт. Проверьте, что Processing-скетч или Max-патч действительно шлют байт обратно после каждого получения строки.
- Строка выглядит обрезанной — убедитесь, что в Serial Monitor включён показ символов
\r\nи что принимающая сторона ждёт именно символ перевода строки как признак конца пакета. - Значения прыгают или не соответствуют реальным — проверьте делители напряжения: резисторы 10 кОм должны быть подключены между пином датчика и
GND, иначе пин «висит в воздухе». - В Processing шарик не двигается — убедитесь, что выбран правильный COM/tty-порт и что Arduino уже загружена со скетчем до запуска Processing.
Где пригодится
Метод call-and-response с ASCII-кодированием хорошо подходит для:
- прототипирования интерактивных инсталляций (Processing, openFrameworks, TouchDesigner);
- отладки — данные читаются в любом терминале без декодирования;
- передачи значений, выходящих за пределы одного байта (например, показания АЦП 0–1023);
- интеграции с музыкальными средами Max/MSP и Pure Data.
Дополнительные материалы
Больше базовых примеров вы найдёте в разделе built-in examples.
Также изучите language reference — подробный справочник по языку программирования Arduino.
Последнее обновление: 29.07.2015, SM