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)покажет значение в шестнадцатеричном виде, что проще сопоставить с документацией на периферию.