Суть, стоят 2 ардуинки, одна мастер другой слейв по дефолту, через функцию onRequest идёт запрос слейву, к сути, отправляю я значение в long побайтно, в сериал принте пишется корректное значение, если делать с ним любые математические операции, или обращаться к этому числу через другую переменную вылазит другое число, как мне раскодировать пришедшее сообщение в нормальное число для математических операций.
Master
#include <Wire_slave.h>
long value1 = 5000305; // Значение типа long
long value12 = 864532; // Значение типа long
void setup() {
//Wire.begin(8); // Присоединяемся к шине I2C с адресом #8
// Wire.onRequest(requestEvent); // Регистрируем событие запроса данных
Wire.begin(8); // Присоединяемся к шине I2C с адресом #8
Wire.onRequest(requestEvent); // Регистрируем событие запроса данных
}
void loop() {
delay(100);
}
// Функция, которая выполняется, когда мастер запрашивает данные
// Эта функция зарегистрирована как событие, см. setup()
void requestEvent() {
// Отправляем все 4 байта значения типа long
Wire.write((uint8_t)(value1 >> 56)); // Старший байт
Wire.write((uint8_t)(value1 >> 48)); // Второй старший байт
Wire.write((uint8_t)(value1 >> 40)); // Младший байт
Wire.write((uint8_t)(value1 >> 32)); // Старший байт
Wire.write((uint8_t)(value1 >> 24)); // Второй старший байт
Wire.write((uint8_t)(value1 >> 16)); // Младший байт
Wire.write((uint8_t)(value1 >> 8)); // Младший байт
Wire.write((uint8_t)value1); // Самый младший
}
Slave
#include <Wire.h>
long result1 = 0;
void setup()
{
Wire.begin(); // Присоединяемся к шине I2C (адрес необязателен для мастера)
Serial.begin(9600); // Запускаем последовательную связь для вывода
}
void loop() {
Wire.requestFrom(8, 8); // Запрашиваем 8 байтов от устройства-раба с адресом #8
while (Wire.available() >= 8) { // Устройство-раб может отправить меньше запрошенного
result1 = (long)Wire.read() << 56;
result1 |= (long)Wire.read() << 48;
result1 |= (long)Wire.read() << 40;
result1 |= (long)Wire.read() << 32;
result1 |= (long)Wire.read() << 24;
result1 |= (long)Wire.read() << 16;
result1 |= (long)Wire.read() << 8;
result1 |= Wire.read();
Serial.println(result1);
//int f = result1;
//Serial.println(f);
}
delay(500);
}
a long скока байт занимает?
8 вроде как
так вроде или как?
8 байт он занимает, что за вопросы?
а если я скажу что 4, то что? есть вопросы?
sizeof запросите от переменной …
Чертовы китайцы, в их ардуинах уже и long 4 байта.
От 4 до 8 ладно, не суть… пожалуйста, просто скиньте пример преобразования
с тобой все в порядке?
ты забыл ножкой топнуть.
Отлично, в коде изменю на 4 байта, как преобразовать то?
А вдруг заработает …
56 сдвигов это конечно пи…ц полный …
А вообще есть union для такого:
union mylong{
byte b[4];
long l;
};
void setup() {
mylong value1;
Serial.begin(115200);
value1.l=0x11223344;
Serial.println(value1.l, HEX);
Serial.println(value1.b[0], HEX);
Serial.println(value1.b[1], HEX);
Serial.println(value1.b[2], HEX);
Serial.println(value1.b[3], HEX);
value1.b[3]=0x55;
Serial.println(value1.l, HEX);
}
void loop() {
}
11223344
44
33
22
11
55223344
и есть адреса/указатели/разименование:
*((byte*)&t+0)
*((byte*)&t+1)
*((byte*)&t+2)
*((byte*)&t+3)
Вот байты от переменной t типа long …
Благодарности принимаю звонкой монетой
где-то у меня был код преобразования серийного номера ESP32 и RP2040 и приведения их к единому типу, Петрович подсказал, как это сделать, вижу актуально