Arduino IDE EEPROM put(), затем read() возвращает разные данные на ESP32
Я пытаюсь понять, как читать/записывать структуру UID от miguelbalboa в EEPROM, чтобы идентификатор карты сохранялся при перезапуске системы на моем ESP32-S3 через Arduino IDE. Я ожидал, что Put/Get/Read будет симметричным, но не могу этого доказать. Вот моя тестовая программа:
/**
* Это простой скрипт для экспериментов с чтением и записью MFRC522::Uid
* структуры в eeprom.
*/
#include <MFRC522.h>
#include <EEPROM.h>
#define UID_EEPROM_LOCATION 0
#define EEPROM_SIZE 256
void setup() {
Serial.begin(115200); // Инициализируем последовательную связь с ПК
Serial.println("Serial started.");
EEPROM.begin(EEPROM_SIZE);
Serial.print("EEPROM started ");
Serial.println(EEPROM_SIZE);
printBytesFromEeprom();
MFRC522::Uid uidToWrite = {
0x04,
{B00000000, B10000000, B11100000, B01100000},
0
};
Serial.print("UID Before Write: ");
printUid(&(uidToWrite));
storeUidInEeprom(&(uidToWrite));
printBytesFromEeprom();
Serial.println("UID was put.");
MFRC522::Uid uidFromRead;
readUidFromEeprom(&(uidFromRead));
printBytesFromEeprom();
Serial.print("UID from Read: ");
printUid(&(uidFromRead));
}
void loop() {
}
void printUid(MFRC522::Uid *uid) {
Serial.print(uid->size, HEX);
Serial.print(F(" byte card UID:"));
for (byte i = 0; i < uid->size; i++) {
if(uid->uidByte[i] < 0x10)
Serial.print(F(" 0"));
else
Serial.print(F(" "));
Serial.print(uid->uidByte[i], HEX);
}
Serial.println();
}
void readUidFromEeprom(MFRC522::Uid* result) {
EEPROM.get(UID_EEPROM_LOCATION, result);
delay(1000);
}
void storeUidInEeprom(MFRC522::Uid *uid) {
EEPROM.put(UID_EEPROM_LOCATION, uid);
EEPROM.commit();
delay(1000);
}
void printBytesFromEeprom() {
Serial.print("256 bytes from EEPROM: ");
for (int i = 0; i < 256; i++) {
byte myByte = EEPROM.read(UID_EEPROM_LOCATION + i);
if(myByte < 0x10)
Serial.print(F(" 0"));
else
Serial.print(F(" "));
Serial.print(myByte, HEX);
}
Serial.println();
}
Я опытный разработчик Java, но плохо знаком с C++. Я мог сделать любое количество основных ошибок.
Когда я запускаю вышеуказанное на моем ESP32-S3-DevKitC-1, я получаю следующий вывод:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd0108,len:0x43c
load:0x403b6000,len:0xbd0
load:0x403ba000,len:0x29c8
entry 0x403b61d8
Serial started.
EEPROM started 256
256 bytes from EEPROM: E4 2C CE 3F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
UID Before Write: 4 byte card UID: 00 80 E0 60
256 bytes from EEPROM: 94 2D CE 3F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
UID was put.
256 bytes from EEPROM: 94 2D CE 3F FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
UID from Read: C0 byte card UID: 79 CD 3F 00 00 00 00 00 00 00 00 0C FA 3B C7 00 00 00 00 04 00 00 00 4C 2F CE 3F 01 00 00 80 00 00 00 00 F0 2D CE 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E CE 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
В этом выводе есть две неожиданные вещи:
- Вывод
readUidFromEeprom()
отличается от вводаstoreUidInEeprom()
Будем рады любой помощи!
@Spina, 👍-1
Обсуждение3 ответа
Ну...
Я до сих пор не знаю, почему это не сработало. Но если я переключусь на свою собственную кодировку байтов в EEPROM (очевидную, которую, как я предполагал, использовала put()
), то я получу правильное поведение:
/**
* Это простой скрипт для экспериментов с чтением и записью MFRC522::Uid
* структуры в eeprom.
*/
#include <MFRC522.h>
#include <EEPROM.h>
#define UID_EEPROM_LOCATION 0
#define EEPROM_SIZE 256
void setup() {
Serial.begin(115200); // Инициализируем последовательную связь с ПК
Serial.println("Serial started.");
EEPROM.begin(EEPROM_SIZE);
Serial.print("EEPROM started ");
Serial.println(EEPROM_SIZE);
printBytesFromEeprom();
MFRC522::Uid uidToWrite = {
0x04,
{B00000000, B10000000, B11100000, B01100000},
0
};
Serial.print("UID Before Write: ");
printUid(&(uidToWrite));
storeUidInEeprom(&(uidToWrite));
printBytesFromEeprom();
Serial.println("UID was put.");
MFRC522::Uid uidFromRead;
readUidFromEeprom(&(uidFromRead));
printBytesFromEeprom();
Serial.print("UID from Read: ");
printUid(&(uidFromRead));
}
void loop() {
}
void printUid(MFRC522::Uid *uid) {
Serial.print(uid->size, HEX);
Serial.print(F(" byte card UID:"));
for (byte i = 0; i < uid->size; i++) {
if(uid->uidByte[i] < 0x10)
Serial.print(F(" 0"));
else
Serial.print(F(" "));
Serial.print(uid->uidByte[i], HEX);
}
Serial.println();
}
void readUidFromEeprom(MFRC522::Uid* result) {
byte uidSize = EEPROM.read(UID_EEPROM_LOCATION);
for (byte i = 0; i < uidSize; i++) {
result->uidByte[i] = EEPROM.read(UID_EEPROM_LOCATION + 1 + i);
}
byte uidSak = EEPROM.read(UID_EEPROM_LOCATION + 2 + uidSize);
result->size = uidSize;
result->sak = uidSak;
}
void storeUidInEeprom(MFRC522::Uid *uid) {
EEPROM.write(UID_EEPROM_LOCATION, uid->size);
for (byte i = 0; i < uid->size; i++) {
EEPROM.write(UID_EEPROM_LOCATION + 1 + i, uid->uidByte[i]);
}
EEPROM.write(UID_EEPROM_LOCATION + 2 + uid->size, uid->sak);
EEPROM.commit();
}
void printBytesFromEeprom() {
Serial.print("256 bytes from EEPROM: ");
for (int i = 0; i < 256; i++) {
byte myByte = EEPROM.read(UID_EEPROM_LOCATION + i);
if(myByte < 0x10)
Serial.print(F(" 0"));
else
Serial.print(F(" "));
Serial.print(myByte, HEX);
}
Serial.println();
}
И ожидаемый результат:
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x8 (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fcd0108,len:0x43c
load:0x403b6000,len:0xbd0
load:0x403ba000,len:0x29c8
entry 0x403b61d8
Serial started.
EEPROM started 256
256 bytes from EEPROM: 04 00 80 E0 60 FF 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
UID Before Write: 4 byte card UID: 00 80 E0 60
256 bytes from EEPROM: 04 00 80 E0 60 FF 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
UID was put.
256 bytes from EEPROM: 04 00 80 E0 60 FF 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
UID from Read: 4 byte card UID: 00 80 E0 60
Вы писали:
void readUidFromEeprom(MFRC522::Uid* result) {
EEPROM.get(UID_EEPROM_LOCATION, result);
delay(1000);
}
Метод EEPROM.get()
ожидает ссылку на переменную, которую вы
параметр. Здесь вместо этого вы предоставляете указатель. Результат
что этот вызов обновляет локальную переменную result
(указатель),
а не область памяти, на которую он указывает.
Вы можете попробовать это:
void readUidFromEeprom(MFRC522::Uid* result) {
EEPROM.get(UID_EEPROM_LOCATION, *result); // обратите внимание на оператор `*'
delay(1000);
}
То же самое для EEPROM.put()
.
Правка: как предложил Юрай в комментарии, может иметь больше смысла
пусть readUidFromEeprom()
принимает ссылку, а не указатель:
void readUidFromEeprom(MFRC522::Uid &result) {
EEPROM.get(UID_EEPROM_LOCATION, result);
delay(1000);
}
Но тогда вы также должны изменить вызывающего абонента:
readUidFromEeprom(uidFromRead);
На платформе ESP23 рассмотрите возможность использования библиотеки настроек. EEPROM в arduino-esp32 эмулируется с помощью библиотеки Preferences. Однако вызовы библиотеки MFRC522 могут испортиться.
Документация по настройкам включает API и руководство.
- ESP32: лучший способ встраивания сертификатов
- Как установить начальное значение eeprom при перепрошивке ESP32
- заставить EEPROM.h использовать пользовательский раздел eeprom
- Что не так с тем, как я записываю и/или считываю адреса EEPROM?
- Esp32: загрузить файл eeprom
- EEPROM: управление сопоставлением адресов между версиями прошивки
- Проблема с сохранением переменной «char» в EEPROM на ESP32.
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
readUidFromEeprom(MFRC522::Uid& результат)
, @Juraj