Библиотека Wire Arduino, приведение типов
У меня возникли проблемы с пониманием этой строки кода, которую я вижу в каждом руководстве по Arduino EEPROM.
int saveLocation = 4095;
Wire.write((int)(saveLocation >> 8));
Вопрос 1: Указывают ли круглые скобки на то, что сдвиг битов происходит ДО приведения типа? Каков порядок операций?
Согласно документации библиотеки wire, вы можете использовать wire
для отправки следующего:
Wire.write(value) // значение для отправки в виде одного байта
Wire.write(String) // строка для отправки в виде последовательности байтов
Wire.write(data, length) // массив данных для отправки в виде байтов, количество байтов для передачи.
Итак, моя переменная int saveLocation = 4095
не является строкой или массивом, поэтому она должна рассматриваться как "значение", что означает, что она отправляется как 1 байт.
Вопрос 2: Если он отправляется как 1 байт, зачем мне приводить его к целому числу в 2 байта?
Вопрос 3: Если saveLocation
уже является целым числом, зачем приводить его к int
?
Вопрос 4: Поскольку int
равен двум байтам, выполняется ли проводка.записать
только отправку младшего байта?
Заранее спасибо за помощь.
@HavocRC, 👍1
Обсуждение2 ответа
Лучший ответ:
Вы правы насчет того, что вы в замешательстве. Этот кастинг не имеет никакого смысла.
Вопрос 1: Указывают ли круглые скобки на то, что сдвиг битов происходит ДО приведения типа? Каков порядок операций?
Да, сдвиг битов происходит перед приведением из-за круглых скобок.
Вопрос 2: Если он отправляется как 1 байт, зачем мне приводить его к целому числу в 2 байта?
Ты бы этого не сделал. Он в любом случае преобразуется в uint8_t
(он же байт
) по типу параметра.
Вопрос 3: Если saveLocation уже является целым числом, зачем приводить его к int?
Для меня это тоже не имеет смысла. Тебе это и не нужно. Хотя здесь это тоже не повредит (то же самое относится и к вопросу 2)
Вопрос 4: Поскольку int равен двум байтам, выполняется ли проводка.записать только отправку младшего байта?
Да, только младший байт. Параметр функции имеет тип uint8_t
, который равен ровно одному байту. Вот в чем причина смещения бита. Сдвигая значение вправо на 8, вы эффективно сдвигаете старший байт в младшую байтовую позицию.
Чувак, я думал, что я сошел с ума! Но чего я не понимаю, так это того, что если вы ищете в Интернете код для обращения к чипам EEPROM, все они используют эту строку для отправки данных. Я подумал, что наверняка мне чего-то не хватает, потому что В КАЖДОМ учебнике есть одна и та же глупая строка кода. Спасибо вам за то, что помогли мне разобраться в этом!, @HavocRC
Часто, когда пример кода написан, он копируется снова и снова по всему Интернету., @chrisl
Вопрос 1: Указывают ли круглые скобки на то, что сдвиг битов происходит ДО приведения типа? Каков порядок операций?
ДА. То, что находится в скобках, вычисляется, а затем результат преобразуется в int.
Вопрос 2: Если он отправляется как 1 байт, зачем мне приводить его к целому числу в 2 байта?
Ты бы этого не сделал.
Вопрос 3: Если saveLocation уже является целым числом, зачем приводить его к int?
Ты бы этого не сделал
Вопрос 4: Поскольку int равен двум байтам, выполняется ли проводка.записать только отправку младшего байта?
Да, только самые младшие 8 бит.
Приведение к целому числу здесь полностью избыточно. Он не выполняет ничего, кроме усложнения понимания кода. Вы можете удалить его, и это не будет иметь никакого значения.
На самом деле наличие приведения int запускает перегруженную функцию:
inline size_t write(int n) { return write((uint8_t)n); }
Так что он все равно просто преобразует его в 8-битное целое число (байт) без знака.
Спасибо и тебе, Маенко. Я не понимаю, почему весь онлайн-код для микросхем EEPROM использует эту строку кода, это не может не сбивать с толку., @HavocRC
- Отправка и получение различных типов данных через I2C в Arduino
- Как выбрать альтернативные контакты I2C на ESP32?
- Альтернативы библиотеке Wire для I2C
- Библиотека Wire.h работает на Uno, но не компилируется для ATtiny85
- Вызов I2C во время Wire.requestFrom
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- Как обнаружить ошибки I2C с помощью requestFrom()
- Проблемы с I2C и Wire.Available()
вам не хватает 1/2 кода адресации EEPROM, @jsotola