将Char写入Arduino EEPROM

时间:2018-08-12 10:39:02

标签: c++ string arduino char eeprom

我在将数据传递到EEPROM时遇到问题。它似乎不接受char变量。我正在按照这里所说的去做: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); 
}

可能是什么错误?

2 个答案:

答案 0 :(得分:0)

看起来像是指针问题,请尝试

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的指针,而不是复制该字符串)

答案 1 :(得分:0)

有点冗长的方法是将结构的每个元素分别写入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检索此信息时,它可以提供更多控制。

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