Написание Char в Arduino 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);
}

В чем может быть ошибка?

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, а не копировал строку)

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 на более позднем этапе.

Я буду первым, кто признает, что это, возможно, не самое элегантное решение, но оно должно помочь решить ваши проблемы.

0

По вопросам рекламы [email protected]