Arduino EEPROM 获取损坏的值

Arduino EEPROM getting corrupt values

我正在使用 Arduino Uno 将几个变量保存到 EEPROM 中。我的解决方案是创建一个自定义结构,在其中存储所有需要的变量,然后使用 EEPROM.put 将它们存储到内置 EEPROM 中。

我的问题不是在放入数据时出现的,而是在获取数据时出现的。每当我在短时间内使用 Arduino 更改我的代码 and/or 时,存储在 EEPROM 中的数据就会损坏。

我通过Serial.println()函数检查数据。据我所知,字符串数据有时会损坏,但其他数据类型不会。可能是字符串数据有问题?

struct EEPROMDATA
{
    String customMessage, emergencyMessage;
    String emergencyContact[3];
    String ownerContact;
    String idleMessage;
    int travelThreshold;
    int idleThreshold;
    char password[6];
    location locationList[3];
};

EEPROMDATA eepromstruct;

void loadReset() 
{
    EEPROM.get(100, eepromstruct);
}

void saveReset()
{
    EEPROM.put(100, eepromstruct);
}

这些是我用来保存(放置)和加载(获取)EEPROM 数据的函数。我在某处读到避免在第 0 个地址写入数据,这就是地址设置为 100 的原因。

请记住,这不是写入 EEPROM 的问题,因为我的程序目前没有任何对 EEPROM.put 或 saveReset() 的引用。不知何故,在程序运行过程中,EEPROM 数据被破坏了。不知道是硬件问题还是软件问题

编辑:我忘了注意,在对此进行故障排除时,每当发生损坏时,我都会重新初始化,然后再次将数据保存在 EEPROM 中。之后它可以正常工作一小段时间(连续转动 on/off 然后测试数据,重置设备等)直到它再次损坏。

当您在代码中的某个位置声明时,您需要使用 char[] 而不是使用 class 对象的 String。在动态内存分配的情况下,对象(class 的实例)应该引用内存的其他区域以通过其方法存储其数据。即使您假设您的数据将存储在 EEPROM 中,但实际上,它存储在 RAM 的某个区域中。这就是为什么您仅使用字符串数据损坏了数据。

首先,如果您更改class EEPROMDATA 的定义,这将"corrupt" 您的eeprom 数据。不是说 eeprom 中的数据以某种方式发生了变化,而是说您正在尝试将以旧格式写入的数据读取为新格式。

接下来,字符串是可变大小的字符数组。结构采用静态内存布局。字符串 class 通过间接(本质上是指针)实现可变长度存储,这不能简单地从 RAM 转换为 EEPROM。

您需要决定是要在 EEPROM 中进行静态布局(在这种情况下您必须停止弄乱结构,并为字符串指定特定数量的字符)还是动态布局(在这种情况下您需要编写一个 "intelligent" 函数来解析 EEPROM 的数据 into/out)