Преобразование числа

Суть, стоят 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 байта.

2 лайка

От 4 до 8 ладно, не суть… пожалуйста, просто скиньте пример преобразования

с тобой все в порядке?

ты забыл ножкой топнуть.

2 лайка

Отлично, в коде изменю на 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 …

Благодарности принимаю звонкой монетой

2 лайка

где-то у меня был код преобразования серийного номера ESP32 и RP2040 и приведения их к единому типу, Петрович подсказал, как это сделать, вижу актуально