Главная chevron_right Функции chevron_right Биты и байты chevron_right lowByte()

lowByte()

lowByte() возвращает младший байт числа (эквивалент x & 0xFF) — удобно при побайтовой передаче данных по I2C, SPI или UART и записи int/long в EEPROM.

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

Описание

Когда вы работаете с числами шире одного байта — например, int (2 байта) или long (4 байта) — иногда нужно выделить отдельные части числа, чтобы передать их по частям. lowByte() возвращает именно младший байт: восемь крайних правых бит исходного значения.

Это особенно актуально при работе с протоколами I2C, SPI и UART, где данные передаются побайтово, а также при ручном разборе многобайтных значений.

Синтаксис

lowByte(x)

Параметры

x: переменная любого типа данных, из которой нужно извлечь младший байт.

Возвращает

Младший байт исходного значения. Тип данных: byte.

Пример кода

unsigned int x = 0xABCD; // Шестнадцатеричное 43981

void setup() {
  Serial.begin(9600);
  
  byte low = lowByte(x);  // Извлекает 0xCD (205 в десятичной)

  Serial.print("The low byte is: ");
  Serial.println(low, HEX);  // Выводит "CD"
 
}

void loop() {
}

Как это работает

Внутри lowByte() выполняет простую побитовую операцию — берёт значение x и оставляет только младшие 8 бит:

#define lowByte(w) ((uint8_t) ((w) & 0xFF))

Иными словами, это эквивалент выражения x & 0xFF. Если, например, x равно 0x1A2B, то lowByte(x) вернёт 0x2B (43 в десятичной).

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

  • Передача многобайтного числа по UART или SPI: сначала отправляется старший байт через highByte(), затем младший через lowByte().
  • Работа с регистрами периферии: многие микросхемы принимают 16-битные значения двумя байтами, и lowByte() позволяет удобно выделить нужную часть.
  • Разбор данных сенсоров: некоторые датчики возвращают 16-битное значение через два регистра — lowByte() помогает собрать или разобрать такое значение.
  • Хранение чисел в EEPROM: запись числа типа int в EEPROM ячейками по одному байту — классическая задача, где без lowByte() и highByte() не обойтись.

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

  • lowByte() работает с любым целочисленным типом: int, unsigned int, long, unsigned long и другими. Результат всегда byte (то есть uint8_t, значения от 0 до 255).
  • Функция не изменяет исходную переменную — она просто возвращает копию младшего байта.
  • Для извлечения старшего байта из двухбайтного числа используйте парную функцию highByte(). Для более длинных типов, где нужны промежуточные байты, удобнее использовать побитовый сдвиг: (x >> 8) & 0xFF, (x >> 16) & 0xFF и так далее.
  • Если вы передаёте число по протоколу с определённым порядком байт (big-endian или little-endian), убедитесь, что отправляете байты в правильном порядке: некоторые устройства ожидают сначала старший байт, другие — младший.
  • При отладке удобно вывести результат в Serial Monitor: Serial.println(lowByte(x), HEX) покажет значение в шестнадцатеричном виде, что проще сопоставить с документацией на периферию.

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