Запись данных в EEPROM на Arduino
В настоящее время я пытаюсь написать функцию для хранения данных в EEPROM на моем Arduino. Пока что я просто пишу указанную строку, а затем читаю ее при первом запуске программы. Я пытаюсь сохранить длину строки в качестве первого байта, и мой код выглядит следующим образом;
#include <EEPROM.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
char string[] = "Test";
void setup() {
lcd.begin( 16, 2 );
for (int i = 1; i <= EEPROM.read(0); i++){ // Here is my error
lcd.write(EEPROM.read(i));
}
delay(5000);
EEPROM_write(string);
}
void loop() {
}
void EEPROM_write(char data[])
{
lcd.clear();
int length = sizeof(data); // I think my problem originates here!
for (int i = 0; i <= length + 2; i++){
if (i == 0){
EEPROM.write(i, length); // Am I storing the length correctly?
lcd.write(length);
}
else{
byte character = data[i - 1];
EEPROM.write(i, character);
lcd.write(character);
}
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что когда я читаю первый байт EEPROM, я получаю предполагаемое значение длины. Однако цикл запускается только три раза. Я прокомментировал некоторые интересные моменты в моем коде, но где ошибка?
1 ответ
Вы действительно правы, по многим причинам, я думаю. Попробуйте это для записи:
// Function takes a void pointer to data, and how much to write (no other way to know)
// Could also take a starting address, and return the size of the reach chunk, to be more generic
void EEPROM_write(void * data, byte datasize) {
int addr = 0;
EEPROM.write(addr++, datasize);
for (int i=0; i<datasize; i++) {
EEPROM.write(addr++, data[i]);
}
}
Вы бы назвали это так:
char[] stringToWrite = "Test";
EEPROM_write(stringToWrite, strlen(stringToWrite));
Читать потом:
int addr = 0;
byte datasize = EEPROM.read(addr++);
char stringToRead[0x20]; // allocate enough space for the string here!
char * readLoc = stringToRead;
for (int i=0;i<datasize; i++) {
readLoc = EEPROM.read(addr++);
readLoc++;
}
Обратите внимание, что это не использует String
класс, разработанный для Arduino: чтение и письмо, которые будут отличаться. Но вышесказанное должно работать на char
строки массива.
Обратите внимание, что в то время как EEPROM_write()
выглядит универсально сейчас, это не так, так как addr
это заклинание Он может только записывать данные в начало EEPROM.