我正在使用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中。之后它可以正常工作一段时间(连续打开/关闭然后测试数据,重置设备等),直到它再次腐蚀。
答案 0 :(得分:2)
当您在代码中的某个位置声明时,您需要使用char []而不是使用String作为类对象。在动态内存分配的情况下,对象(类的一个实例)应该引用内存的其他区域来通过其方法存储其数据。即使你假设你的数据存储在EEPROM中,但实际上它存储在RAM的某个区域。这就是为什么你只有String数据损坏了数据。
答案 1 :(得分:0)
首先,如果你改变EEPROMDATA类的定义,这将"腐败"你的eeprom数据。不是因为eeprom中的数据以某种方式发生了变化,而是因为您试图将以旧格式写入的数据读取为新格式。
接下来,字符串是可变大小的char数组。结构假定静态内存布局。 String类通过间接(本质上是指针)实现可变长度存储,这不能简单地从RAM转换为EEPROM。
您需要决定是否要在EEPROM中进行静态布局(在这种情况下,您必须停止使用结构,并将特定数量的字符专用于字符串)或动态(在这种情况下,您需要编写& #34;智能"用于将数据解析进/出EEPROM的功能