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()и скорость, выбранная в мониторе, совпадают.