2

現在、ArduinoのEEPROMにデータを保存する関数を書き込もうとしています。これまでのところ、指定した文字列を書き込んでから、プログラムが最初に実行されたときにそれを読み戻しています。文字列の長さを最初のバイトとして格納しようとしていますが、コードは次のとおりです。

#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の最初のバイトを読み取るときに、想定される長さの値を取得することです。ただし、ループは3回しか実行されません。コードのいくつかの興味深い点にコメントしましたが、エラーはどこにありますか?

4

1 に答える 1

3

多くの点で、あなたは確かに正しいと思います。これを書いてみてください:

// 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++;
}

これは Arduino 用に開発されたクラスを使用していないことに注意してくださいString: 読み取りと書き込みは異なります。ただし、上記はchar配列文字列に対して機能するはずです。

ただし、現在は汎用的にEEPROM_write() 見えますが、ハードコーディングされているため、実際にはそうではないことに注意してくださいaddr。EEPROM の先頭にのみデータを書き込むことができます。

于 2013-03-11T23:44:17.913 に答える