Ошибка при записи и чтении из EEProm

Добрый день.
После записи в EEPROM числа 50005 после чтения получаю число -15531.

Может кто-нибудь подскажет, что я делаю не так?
Контроллер Mega2560
РЕШЕНИЕ!!! - тему можно закрывать

#include <EEPROM.h>
struct Memory {
 uint8_t ServiceInformation[35] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
};
Memory RW_EEprom;

uint16_t sn = 50005;

void setup() {
  Serial.begin(9600);

  RW_EEprom.ServiceInformation[0] = (sn >> 8) & 0xFF;
  RW_EEprom.ServiceInformation[34] = sn & 0xFF;

  EEPROM.put(0, RW_EEprom); // Запись данных
  EEPROM.get(0, RW_EEprom); // Читаем данные

  uint16_t sn2 = (RW_EEprom.ServiceInformation[0] << 8) | RW_EEprom.ServiceInformation[34];

  Serial.print("<SN:"); Serial.print(sn2); Serial.println(">");
}

void loop() {
}

это одно и тоже

? Не понимаю?
В порт должно выводится 50005

Вставьте код нормально

Я пробовал
`` не работает

беззнаковое 50005 и знаковое -15531 в ЕЕПРОМ хранятся одинаково как два байта 0xC3 0х55.

Что это будет - 50005 или -15531 - решаете вы, а не компьютер

тогда досвиданья

1 лайк

Для вставки кода используем `` ? Не работает. Это видно в сообщении, код я оборачивал.

вы разницу между одним апострофом или тремя понимаете? Или вам все равно, дадут ли вам 5 или 555 рублей?

хотя фиг с вами, на вопрос я ответил

1 лайк

Подскажите, как “решить”, что это будет именно 50005?

я смотрю вы код уже изменили.
При таком раскладе я не вижу смысла отвечать на прежний вопрос

кто мешает, сделать обратные действия после чтения и выводить уже sn?

ааа, уже додумался))

ОК, первый вариант работает, но не работает в данном случае. На выходе получается 16961:

#include <EEPROM.h>
struct Memory {
 uint8_t ServiceInformation[35] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
};
Memory RW_EEprom;

uint32_t TestCount = 1000001;

void setup() {
  Serial.begin(9600);
  
  RW_EEprom.ServiceInformation[1] = (TestCount >> 16) & 0xFF;
  RW_EEprom.ServiceInformation[2] = (TestCount >> 8) & 0xFF;
  RW_EEprom.ServiceInformation[3] = TestCount & 0xFF;

  EEPROM.put(0, RW_EEprom); // Запись данных
  EEPROM.get(0, RW_EEprom); // Читаем данные

  uint32_t countTmp = (RW_EEprom.ServiceInformation[1] << 16) | (RW_EEprom.ServiceInformation[2] << 8) | RW_EEprom.ServiceInformation[3];
  Serial.print("<Count:"); Serial.print(countTmp); Serial.println(">");
}

void loop() {
}

коротко - внутри этой скобки будет переполнение и данные испортятся

Скажите, автор, а нахрена вам дополнительная структура типа

Что мешает делать все что вы хотите в рамках обычного класса ЕЕПРОМ, который сам умеет записывать и считывать разные типы данных, вто числе и 16-ти и 32-х битные целые числа?
Вы-то явно умеете делать это хуже, чем библиотека - так не выпендривайтесь, используйте ЕЕПРОМ

Да, я это уже понял. Можете объяснить, каким образом корректно прочитать данные?

привести это выражение к 32битам ДО СДВИГА

#include <EEPROM.h>
struct Memory {
 uint8_t ServiceInformation[35] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
};
Memory RW_EEprom;

uint32_t TestCount = 1000001;

void setup() {
  Serial.begin(9600);
  
  RW_EEprom.ServiceInformation[1] = (TestCount >> 16) & 0xFF;
  RW_EEprom.ServiceInformation[2] = (TestCount >> 8) & 0xFF;
  RW_EEprom.ServiceInformation[3] = TestCount & 0xFF;

  EEPROM.put(0, RW_EEprom); // Запись данных
  EEPROM.get(0, RW_EEprom); // Читаем данные

  uint32_t a = RW_EEprom.ServiceInformation[1];
  uint32_t b = RW_EEprom.ServiceInformation[2];
  uint32_t c = RW_EEprom.ServiceInformation[3];

  uint32_t countTmp = (a << 16) | (b << 8) | c;
  Serial.print("<Count:"); Serial.print(countTmp); Serial.println(">");
}

void loop() {
}

Спасибо. Хотел максимально не перегружать код и отказаться от дополнительных переменных.

Структуру использую для того, что бы не запутаться в адресах, т.к. в EEPROM много различных настроек и эта лишь одна из них.

В любом случае спасибо за помощь.