Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino EEPROM获取损坏的值_C++_Memory_Struct_Arduino_Arduino Uno - Fatal编程技术网

C++ Arduino EEPROM获取损坏的值

C++ Arduino EEPROM获取损坏的值,c++,memory,struct,arduino,arduino-uno,C++,Memory,Struct,Arduino,Arduino Uno,我正在使用Arduino Uno将几个变量保存到EEPROM中。我的解决方案是创建一个自定义结构,在其中存储所有需要的变量,然后使用EEPROM.put将它们存储到内置的EEPROM中 我的问题不是在放置数据时出现的,而是在获取数据时出现的。每当我在短时间内更改代码和/或使用Arduino时,EEPROM中存储的数据就会损坏 我通过Serial.println()函数检查数据。有时字符串数据会被破坏,但就我记忆所及,其他数据类型不会被破坏。可能是字符串数据的问题 struct EEPROMDAT

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

我的问题不是在放置数据时出现的,而是在获取数据时出现的。每当我在短时间内更改代码和/或使用Arduino时,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中。之后,它会在短时间内正常工作(连续打开/关闭,然后测试数据、重置设备等),直到它再次损坏。

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

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

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

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


您需要决定是在EEPROM中使用静态布局(在这种情况下,您必须停止混乱结构,并为字符串指定特定数量的字符)还是动态布局(在这种情况下,您需要编写一个“智能”函数来解析进出EEPROM的数据)

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

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


您需要决定是在EEPROM中使用静态布局(在这种情况下,您必须停止使用结构,并为字符串指定特定数量的字符)还是动态布局(在这种情况下,您需要编写一个“智能”函数来解析进出EEPROM的数据)

如果您没有保存数据,为什么您认为数据不应该被破坏(“没有对saveReset的引用”)?我忘了注意,一旦发生破坏,我会重新初始化然后保存数据。然后,它会在之后的一段短时间内正常工作,直到再次损坏。如果不保存数据,为什么您认为数据不应该损坏(“没有对saveReset的引用”)?我忘了注意,一旦损坏发生,我会重新初始化然后保存数据。然后它在之后的短时间内工作正常,直到它再次被破坏。我也这么怀疑。我知道使用String而不是char[]将在将来产生影响。有没有办法在程序中使用字符串而在EEPROM中仅使用char[]呢?我们有一个项目的最后期限,我不想经历所有的麻烦,改变所有的操作和功能,以适应字符[]的使用。我不确定这是否有助于你或没有。但您可以为所有其他函数保留当前结构类型。首先,您可以定义另一个结构,该结构使用char[]代替String,用于从EEPROM加载和保存。然后您需要更改“loadReset()”和“saveReset()”。在两个函数中,您需要在char[]和String之间转换数据。通过这种方式,您可以保持其他源代码的原样。很高兴知道我们在考虑同样的方法。这是一个好主意,我不知道可能会奏效。谢谢。除了我的建议之外,还有一个建议是在EEPROM存储器的新结构中定义一个附加字段,用于在从EEPROM读取数据之前检查数据的有效性,即魔术码(或版本码)。无论何时更改结构字段,这都会对您有所帮助。谢谢您的帮助。我使用了char[]而不是String,此后数据一直没有损坏。在完成论文项目方面真的很有帮助。我也这么怀疑。我知道使用String而不是char[]将在将来产生影响。使用Str有什么折衷的方法吗