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 и большом объёме данных это заметно.