首页 文章

Arduino EEPROM获得了腐败的 Value

提问于
浏览
0

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

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

我通过Serial.println()函数检查数据 . 据我记忆,String数据有时会被破坏,但其他数据类型不会被破坏 . 可能是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 回答

  • 2

    首先,如果更改EEPROMDATA类的定义,这将“破坏”您的eeprom数据 . 不是因为eeprom中的数据以某种方式发生了变化,而是因为您试图将以旧格式写入的数据读取为新格式 .

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

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

  • 0

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

相关问题