Главная chevron_right Функции chevron_right Связь chevron_right Serial.println()

Serial.println()

Serial.println() отправляет данные в последовательный порт как текст и автоматически добавляет \r\n в конце — каждое сообщение оказывается на отдельной строке в Serial Monitor.

Полная статья

Описание

Serial.println() работает так же, как Serial.print(), но после вывода значения автоматически дописывает два символа: возврат каретки \r и перевод строки \n. Вместе они образуют последовательность \r\n, которую Serial Monitor и большинство терминальных программ воспринимают как сигнал начать новую строку.

Это делает Serial.println() главным инструментом отладки: каждое значение или сообщение оказывается на отдельной строке, и вывод легко читать даже при быстром потоке данных.

Как и Serial.print(), функция преобразует данные в читаемый ASCII-текст перед отправкой:

  • Serial.println(78) выводит "78" и затем \r\n
  • Serial.println(78, HEX) выводит "4E" и затем \r\n
  • Serial.println(1.23456, 2) выводит "1.23" и затем \r\n

Если перевод строки в конце не нужен — например, когда вы собираете несколько значений в одну строку — используйте Serial.print().

Синтаксис

  • Serial.println(val)
  • Serial.println(val, format)

Параметры

  • Serial — объект последовательного порта. На платах с несколькими аппаратными UART доступны также Serial, Serial1, Serial2 и другие. Полный список портов для вашей платы смотрите на странице Serial.
  • val — значение для вывода: строка, символ, целое число, число с плавающей точкой или другой поддерживаемый тип данных.
  • format — необязательный параметр. Для целых чисел задаёт систему счисления: BIN (десятичная, по умолчанию), OCT (двоичная), DEC (шестнадцатеричная), HEX (восьмеричная). Для чисел с плавающей точкой задаёт количество знаков после десятичной точки — например, Serial.println(1.23456, 2) выведет "1.23".

Возвращает

Количество байтов, фактически записанных в выходной буфер. Тип данных: size_t. В большинстве скетчей это значение не используется, но его можно проверить, если нужно убедиться, что данные были приняты буфером.

Пример кода

/*
  Аналоговый ввод: считывает значение с аналогового входа 0 и выводит его.
  Создано 24 марта 2006 г.
  Автор: Tom Igoe
  */

int analogValue = 0;    // переменная для хранения аналогового значения

void setup() {
  // открыть последовательный порт на скорости 9600 bps:
  Serial.begin(9600);
}

void loop() {
  // считать аналоговый вход на пине 0:
  analogValue = analogRead(0);

  // вывести в различных форматах:
  Serial.println(analogValue);       // вывести как десятичное число в ASCII-кодировке
  Serial.println(analogValue, DEC);  // вывести как десятичное число в ASCII-кодировке
  Serial.println(analogValue, HEX);  // вывести как шестнадцатеричное число в ASCII-кодировке
  Serial.println(analogValue, OCT);  // вывести как восьмеричное число в ASCII-кодировке
  Serial.println(analogValue, BIN);  // вывести как двоичное число в ASCII-кодировке

  // задержка 10 миллисекунд перед следующим считыванием:
  delay(10);
}

Где применяется

  • Отладка в Serial Monitor — каждое сообщение выводится на отдельной строке и не сливается с предыдущим, что особенно удобно при выводе нескольких переменных в цикле.
  • Вывод таблиц и списков — удобно печатать по одному значению на строку или завершать строку после нескольких вызовов Serial.print().
  • Простые текстовые протоколы — многие программы на стороне компьютера читают данные построчно и ждут \r\n или \n как признак конца сообщения.

Практические замечания

  • println() всегда добавляет именно два символа: \r и \n. Если принимающая сторона ожидает только \n, в большинстве случаев это не создаёт проблем, но при строгом разборе протокола стоит это учитывать.
  • Чтобы вывести данные без перевода строки — например, несколько значений в одну строку — используйте Serial.print(), а в конце вызовите Serial.println() без аргументов или с пустой строкой.
  • Как и Serial.print(), функция может заблокировать выполнение скетча, если выходной буфер переполнен: данные отправляются медленнее, чем поступают. Это особенно заметно при высокой частоте вызовов в loop() и низкой скорости порта.
  • Если важно дождаться, пока все данные физически покинут буфер и уйдут в порт, вызовите Serial.flush() после серии выводов.

Полезные материалы