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

Serial.print()

Serial.print() отправляет данные в последовательный порт как читаемый текст: строки, числа и символы с поддержкой BIN/OCT/DEC/HEX и настраиваемой точностью для float.

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

Описание

Serial.print() — одна из самых часто используемых функций в Arduino-разработке. Она берёт переданное значение, преобразует его в текстовые символы ASCII и отправляет через выбранный последовательный порт. Именно её вы видите почти в каждом скетче, где нужно что-то вывести в Serial Monitor для отладки или логирования.

То, как именно значение будет отображено, зависит от его типа:

  • Serial.print(78) выводит "78"
  • Serial.print(1.23456) выводит "1.23" — по умолчанию с двумя знаками после десятичной точки
  • Serial.print('N') выводит "N"
  • Serial.print("Hello world.") выводит "Hello world."

Для целых чисел можно указать систему счисления вторым параметром format:

  • Serial.print(78, BIN) выводит "1001110"
  • Serial.print(78, OCT) выводит "116"
  • Serial.print(78, DEC) выводит "78"
  • Serial.print(78, HEX) выводит "4E"

Для чисел с плавающей точкой второй параметр задаёт количество знаков после точки:

  • Serial.print(1.23456, 0) выводит "1"
  • Serial.print(1.23456, 2) выводит "1.23"
  • Serial.print(1.23456, 4) выводит "1.2346"

Если скетч выводит много постоянных строк и SRAM начинает заканчиваться, передавайте строковые литералы через макрос F() — это позволяет хранить их во flash-памяти, не занимая оперативную:

Serial.print(F("Hello World"))

Когда нужно передать данные в «сыром» бинарном виде без какого-либо текстового преобразования, используйте вместо этого Serial.write().

Синтаксис

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

Параметры

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

Возвращает

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

Пример кода

/*
  Использует цикл for для вывода чисел в различных форматах.
*/
void setup() {
  Serial.begin(9600); // открыть последовательный порт на скорости 9600 bps:
}

void loop() {
  // печать заголовков
  Serial.print("NO FORMAT");  // печатает заголовок
  Serial.print("\t");         // печатает табуляцию

  Serial.print("DEC");
  Serial.print("\t");

  Serial.print("HEX");
  Serial.print("\t");

  Serial.print("OCT");
  Serial.print("\t");

  Serial.print("BIN");
  Serial.println();        // перевод строки после последнего заголовка

  for (int x = 0; x < 64; x++) { // только часть таблицы ASCII, измените по необходимости
    // вывод в различных форматах:
    Serial.print(x);       // вывод в десятичном ASCII-формате — то же, что "DEC"
    Serial.print("\t\t");  // печатает две табуляции с учётом длины заголовка

    Serial.print(x, DEC);  // вывод в десятичном ASCII-формате
    Serial.print("\t");    // печатает табуляцию

    Serial.print(x, HEX);  // вывод в шестнадцатеричном ASCII-формате
    Serial.print("\t");    // печатает табуляцию

    Serial.print(x, OCT);  // вывод в восьмеричном ASCII-формате
    Serial.print("\t");    // печатает табуляцию

    Serial.println(x, BIN);  // вывод в двоичном ASCII-формате
    // затем добавляет перевод строки с помощью "println"
    delay(200);            // задержка 200 миллисекунд
  }
  Serial.println();        // печатает ещё один перевод строки
}

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

  • Отладка скетча — вывод значений переменных, показаний датчиков или контрольных точек выполнения программы в Serial Monitor.
  • Простой текстовый обмен — передача человекочитаемых сообщений между платой и компьютером или другим устройством.
  • Диагностика числовых форматов — быстро увидеть одно и то же значение в DEC, HEX, OCT и BIN для проверки битовых масок или адресов.
  • Экономия SRAM — вывод постоянных строк через F("..."), когда проект вплотную подошёл к лимиту оперативной памяти.

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

  • Serial.print() всегда преобразует данные в текстовые символы. Если нужно передать байты без изменений — для бинарных протоколов, файлов или буферов — используйте Serial.write().
  • Передача данных на большинстве плат асинхронная: значения попадают в буфер и отправляются постепенно по мере работы UART. Если заполнить буфер быстрее, чем он успевает опустошаться, функция начнёт блокировать выполнение скетча, пока не освободится место.
  • Чтобы дождаться, когда все накопленные данные реально уйдут в линию, вызовите Serial.flush() после серии вызовов Serial.print().
  • Десятичный разделитель для чисел с плавающей точкой всегда точка, независимо от региональных настроек операционной системы.
  • Если в Serial Monitor вместо читаемого текста видны случайные символы или «мусор», первым делом убедитесь, что скорость в Serial.begin() и скорость, выбранная в мониторе, совпадают.

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