Arduino EEPROM变得腐败

时间:2018-02-27 16:23:34

标签: c++ memory struct arduino arduino-uno

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

我的问题不是在放置数据时,而是在获取数据时出现的。每当我在代码中更改某些内容和/或在很短的时间内使用Arduino时,存储在EEPROM中的数据都会被破坏。

我通过Serial.println()函数检查数据。在我记忆中,String数据有时会被破坏,但其他数据类型不会被破坏。可能是字符串数据的问题?

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中。之后它可以正常工作一段时间(连续打开/关闭然后测试数据,重置设备等),直到它再次腐蚀。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

首先,如果你改变EEPROMDATA类的定义,这将"腐败"你的eeprom数据。不是因为eeprom中的数据以某种方式发生了变化,而是因为您试图将以旧格式写入的数据读取为新格式。

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

您需要决定是否要在EEPROM中进行静态布局(在这种情况下,您必须停止使用结构,并将特定数量的字符专用于字符串)或动态(在这种情况下,您需要编写& #34;智能"用于将数据解析进/出EEPROM的功能