Writing Char to Arduino EEPROM



我在将数据传递给EEPROM时遇到问题。它似乎不接受字符变量。我正在做这里所说的:https://www.arduino.cc/en/Reference/EEPROMPut

所以我的这是我的对象结构

struct DeviceDataObject {
bool flag;
char data[20];
char data2[20];
int rate1;
int rate2;
int rate3;
};

因此,当我测试时:

int RATES[3] = {300, 1500, 3600};
DeviceDataObject new_data = {true, "Data1Sample", "Sample2", RATES[0], RATES[1], RATES[2]};
WRITE_Device(new_data);

这是我的写作功能

void WRITE_Device(DeviceDataObject data) {
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
int eeAddress = 0;
float f = 123.456f;  //Variable to store in EEPROM.
EEPROM.put(eeAddress, f);
eeAddress += sizeof(float); //Move address to the next byte after float 'f'.
EEPROM.put(eeAddress, data);
//Serial.println("Memory Data Updated");
}

一切似乎都很好。但是,如果我用变量替换"Data1Sample""Sample2",EEPROM的数据似乎被错误地更改了。

void ChangeValue(String value) {
int RATES[3] = {300, 1500, 3600};
char charBuf[20];
value.toCharArray(charBuf, 20); //Convert to char
DeviceDataObject new_data = {true, "", {charBuf}, RATES[0], RATES[1], RATES[2]}
WRITE_Device(new_data); 
}

可能有什么错误?

看起来像一个指针问题,试试这个

void ChangeValue(String value) {
int RATES[3] = {300, 1500, 3600};
DeviceDataObject new_data = {true, "", "", RATES[0], RATES[1], RATES[2]}
value.toCharArray(new_data.data2, 20); //Convert to char
WRITE_Device(new_data); 
}

(您正在创建一个字符串,其中第一个字符是指向堆栈变量 charBuf 的指针,而不是复制字符串(

一种有点冗长的方法是将结构的每个元素单独写入EEPROM。代码看起来像这样,应该允许您更有效地隔离任何问题。

ee_address = 0;
EEPROM.put(ee_address, new_data.flag);
ee_address += sizeof(new_data.flag);  // Update address to store next variable
EEPROM.put(ee_address, new_data.data);
ee_address += sizeof(new_data.data);
EEPROM.put(ee_address, new_data.data2);
ee_address += sizeof(rawdata.data2);
EEPROM.put(ee_address, new_data.rate1);
ee_address += sizeof(new_data.rate1);
EEPROM.put(ee_address, new_data.rate2);
ee_address += sizeof(new_data.rate2);
EEPROM.put(ee_address, new_data.rate3);
ee_address += sizeof(rawdata.rate3);

这样可以更轻松地排除变量是否未正确写入EEPROM或问题是否源于其他原因的故障。

这是我在存储我为 EEPROM 定义的结构时通常采用的方法,因为它在以后从 EEPROM 检索此信息时提供了更多的控制。

我将是第一个承认这可能不是最优雅的解决方案的人,但它应该有助于解决您的问题。

最新更新