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

Serial.write()

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

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

Описание

Serial.write() передаёт данные через последовательный порт в двоичном виде — то есть именно те байты, которые вы передаёте, без какого-либо преобразования. Это принципиальное отличие от Serial.print(), которая отправляет символьное представление числа: например, число 65 функция Serial.write() отправит как один байт со значением 65 (символ 'A' в ASCII), а Serial.print(65) отправит два байта — символы '6' и '5'.

Используйте Serial.write(), когда нужно передать бинарные протоколы, сырые байты или работать с устройствами, которые ожидают именно байтовый поток, а не текст.

Синтаксис

Доступны три варианта вызова:

  • Serial.write(val)
  • Serial.write(str)
  • Serial.write(buf, len)

Параметры

  • Serial — объект последовательного порта. На платах с несколькими портами (например, Mega) можно использовать Serial1, Serial2 и т. д. Список портов для каждой платы смотрите на странице Serial.
  • val — одно значение, которое будет отправлено как единственный байт. Подходит для передачи чисел в диапазоне 0–255.
  • str — строка в стиле C (с нулевым символом в конце), которая будет отправлена побайтово.
  • buf — массив байтов для последовательной отправки.
  • len — количество байтов из массива buf, которые нужно отправить. Позволяет отправить только часть массива.

Возвращает

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

Пример кода

Следующий пример демонстрирует работу Serial.write():

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

void loop() {
  Serial.write(45); // отправить байт со значением 45

  int bytesSent = Serial.write("hello");  //отправить строку "hello" и вернуть её длину
}

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

  • Обмен данными с другим микроконтроллером или модулем по бинарному протоколу (например, GPS, Bluetooth-модули, дисплеи).
  • Передача массивов измерений или структур данных без текстового кодирования — это быстрее и компактнее.
  • Управление устройствами, которые ожидают конкретные байты команд (например, сервоприводы или драйверы моторов через UART).
  • Реализация собственного бинарного протокола между Arduino и компьютером.

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

  • Буферизация и блокировка. Последовательная передача асинхронна: Serial.write() возвращает управление сразу, если в буфере передачи есть место. Если буфер заполнен, Serial.write() будет ждать (блокировать выполнение скетча), пока место не освободится. Это важно учитывать в чувствительных ко времени задачах.
  • Проверка свободного места. Чтобы избежать блокировки, перед вызовом можно проверить объём свободного места в буфере с помощью Serial.availableForWrite(). Если места недостаточно — отложите отправку или обработайте ситуацию в коде.
  • val — это байт, не число. Если передать Serial.write(65), на другой стороне придёт байт 0x41, то есть символ 'A'. Если нужно передать текстовое представление числа, используйте Serial.print().
  • Отправка части массива. Параметр len позволяет отправить только нужное количество байтов из массива, не обязательно весь. Это удобно при работе с буферами фиксированного размера.
  • Скорость. Serial.write() работает быстрее Serial.print() для бинарных данных, поскольку не выполняет преобразование в текст. При высоком baudrate и большом объёме данных это заметно.

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