itehno
19.Сентябрь.2023 09:53:21
1
Добрый день.
После записи в 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() {
}
itehno
19.Сентябрь.2023 09:55:11
3
? Не понимаю?
В порт должно выводится 50005
itehno
19.Сентябрь.2023 09:57:57
5
Я пробовал
`` не работает
b707
19.Сентябрь.2023 10:09:13
6
itehno:
? Не понимаю?
беззнаковое 50005 и знаковое -15531 в ЕЕПРОМ хранятся одинаково как два байта 0xC3 0х55.
Что это будет - 50005 или -15531 - решаете вы, а не компьютер
itehno
19.Сентябрь.2023 10:10:59
8
Для вставки кода используем `` ? Не работает. Это видно в сообщении, код я оборачивал.
b707
19.Сентябрь.2023 10:11:54
9
вы разницу между одним апострофом или тремя понимаете? Или вам все равно, дадут ли вам 5 или 555 рублей?
b707
19.Сентябрь.2023 10:12:32
10
хотя фиг с вами, на вопрос я ответил
1 лайк
itehno
19.Сентябрь.2023 10:41:32
11
Подскажите, как “решить”, что это будет именно 50005?
b707
19.Сентябрь.2023 11:03:13
12
я смотрю вы код уже изменили.
При таком раскладе я не вижу смысла отвечать на прежний вопрос
xDriver
19.Сентябрь.2023 11:13:30
13
кто мешает, сделать обратные действия после чтения и выводить уже sn?
ааа, уже додумался))
itehno
19.Сентябрь.2023 11:17:04
14
ОК, первый вариант работает, но не работает в данном случае. На выходе получается 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() {
}
b707
19.Сентябрь.2023 11:19:57
15
коротко - внутри этой скобки будет переполнение и данные испортятся
b707
19.Сентябрь.2023 11:22:58
16
Скажите, автор, а нахрена вам дополнительная структура типа
itehno:
Memory RW_EEprom;
Что мешает делать все что вы хотите в рамках обычного класса ЕЕПРОМ, который сам умеет записывать и считывать разные типы данных, вто числе и 16-ти и 32-х битные целые числа?
Вы-то явно умеете делать это хуже, чем библиотека - так не выпендривайтесь, используйте ЕЕПРОМ
itehno
19.Сентябрь.2023 11:23:00
17
Да, я это уже понял. Можете объяснить, каким образом корректно прочитать данные?
b707
19.Сентябрь.2023 11:24:09
18
привести это выражение к 32битам ДО СДВИГА
itehno
19.Сентябрь.2023 11:26:17
19
#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() {
}
itehno
19.Сентябрь.2023 11:29:14
20
Спасибо. Хотел максимально не перегружать код и отказаться от дополнительных переменных.
Структуру использую для того, что бы не запутаться в адресах, т.к. в EEPROM много различных настроек и эта лишь одна из них.
В любом случае спасибо за помощь.