Глиф Учебники

Урок 5. Монитор порта — Serial.begin и Serial.println

Курс «Arduino» · урок 5 из 10 · 4 минуты чтения

У Arduino нет экрана, но есть связь с компьютером через тот же USB-кабель, которым загружают скетч. По нему плата может отправлять текст — значения датчиков, сообщения «кнопка нажата», — а Serial Monitor (монитор порта) в Arduino IDE показывает этот текст. Это главный способ понять, что происходит внутри скетча.

Первое сообщение

Arduino
void setup() {
  Serial.begin(9600);                        // запустить связь на скорости 9600
  Serial.println("Привет! Плата запущена.");
}

void loop() {
  Serial.print("Прошло секунд: ");
  Serial.println(millis() / 1000);           // время с запуска, в секундах
  delay(1000);
}

Загрузите скетч и откройте монитор: кнопка в правом верхнем углу окна IDE или Tools → Serial Monitor (Ctrl+Shift+M). Монитор открывается внизу окна. Проверьте, что справа в нём выбрана скорость 9600 baud — та же, что в Serial.begin. Каждую секунду будет появляться новая строка — начало выглядит так:

Текст
Привет! Плата запущена.
Прошло секунд: 0
Прошло секунд: 1
Прошло секунд: 2

Что здесь происходит

Serial.begin(скорость) запускает последовательный порт. Скорость — сколько бит в секунду передаётся (бод, baud). 9600 — привычное значение из примеров, 115200 — в 12 раз быстрее. Важно одно: в скетче и в мониторе скорость должна совпадать. Если не совпадает, вместо текста видны «кракозябры» — подробнее в справке Непонятные символы в мониторе порта.

Плата Arduino Serial.begin(9600); порт занимает выводы 0 и 1 Serial Monitor Привет! Плата запущена. Прошло секунд: 0 Прошло секунд: 1 строка ввода 9600 baud Serial.print(…) Serial.read() USB скорость — одна
Плата и Serial Monitor связаны по USB: Serial.print отправляет текст в монитор, Serial.read читает строку ввода; скорость 9600 задана с обеих сторон одинаково.

Serial.print(…) отправляет текст или число и остаётся на той же строке. Serial.println(…) делает то же и переходит на новую строку. Обычно строку собирают из нескольких print и завершают одним println.

команда в мониторе после неё Serial.print("Прошло секунд: "); Прошло секунд: курсор остался в этой строке Serial.println(millis() / 1000); Прошло секунд: 0 число и перевод строки
После Serial.print курсор монитора остаётся в той же строке, после Serial.println число дописывается в неё же и курсор переходит на новую строку.

millis() — время в миллисекундах с момента запуска платы; поделив на 1000, получают секунды. Подробно о ней — в уроке millis вместо delay.

Обратите внимание: при открытии монитора Arduino Uno и Nano перезапускаются, и скетч начинается сначала. Поэтому приветствие из setup видно даже если монитор открыт позже загрузки.

Числа

print и println печатают числа сами, без преобразований:

На Uno и Nano функция sprintf не умеет печатать дробные числа через %f — вместо числа выйдет ?. Печатайте дробные числа через Serial.print.

Команды с компьютера

В мониторе есть строка ввода: текст из неё отправляется в плату. В скетче его читают двумя функциями:

Скетч, который включает и выключает светодиод на плате по командам:

Arduino
void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.println("Отправьте 1 — включить, 0 — выключить");
}

void loop() {
  if (Serial.available() > 0) {     // пришёл хотя бы один символ
    char c = Serial.read();         // забрать его
    if (c == '1') {
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("Светодиод включён");
    } else if (c == '0') {
      digitalWrite(LED_BUILTIN, LOW);
      Serial.println("Светодиод выключен");
    }
  }
}

Наберите в строке ввода 1 и нажмите Enter — светодиод загорится, в мониторе появится ответ. Рядом со скоростью в мониторе есть список окончания строки (No Line Ending, New Line и другие): монитор может дописывать к каждой отправке символ перевода строки. В этом скетче он ни на что не влияет — символ не равен ни '1', ни '0'.

Serial Monitor 1 Enter режим New Line Пришло в плату — по очереди '1' '\n' Serial.available() > 0 — есть что читать '\n' — перевод строки проход loop: Serial.read() c = '1' → c == '1' светодиод включён, ответ следующий проход: Serial.read() c = '\n' не '1' и не '0' — ничего
В режиме New Line набранная 1 с Enter приходит в плату двумя символами: первый Serial.read забирает 1 и включает светодиод, следующий — перевод строки, и скетч его пропускает.

Символ в одинарных кавычках '1' — это один знак, строка в двойных "1" — текст. Serial.read() возвращает именно знак, поэтому сравнивают с '1'.

Графики: Serial Plotter

Если скетч печатает в каждой строке только число, его можно увидеть графиком: Tools → Serial Plotter. Например, показания потенциометра на входе A0 (о нём — в уроке Аналоговые входы и ШИМ):

Arduino
void setup() {
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(A0);   // число от 0 до 1023
  Serial.println(value);
  delay(20);
}

Несколько чисел в одной строке через пробел плоттер рисует несколькими линиями.

Отладка выводом

Когда скетч ведёт себя странно, добавьте Serial.println в подозрительные места: «дошли до сюда», значение переменной, результат условия. Это самый простой и самый частый способ найти ошибку на Arduino.

Две тонкости:

Коротко

Проверьте себя

1. В скетче Serial.begin(115200), а в мониторе выбрано 9600 baud. Что будет?
2. Чем Serial.print отличается от Serial.println?
3. Что напечатает Serial.println(2.71828);?
4. Что возвращает Serial.available()?