将字符串写入Arduino ESP32的永久闪存内存

5
我想将一些文本写入Arduino ESP32的闪存中。它有点能用,但不是我想要的方式。
void writeString(const char* toStore, int startAddr) {
  int i = 0;
  for (; i < LENGTH(toStore); i++) {
    EEPROM.write(startAddr + i, toStore[i]);
  }
  EEPROM.write(startAddr + i, '\0');
  EEPROM.commit();
}

我的呼叫

writeString("TEST_STRING_TO_WRITE", 0);

只将TEST写入内存。我不明白为什么会这样。是因为下划线吗?还是我漏掉了其他内容?

以下是使用的LENGTH宏:

#define LENGTH(x) (sizeof(x)/sizeof(x[0]))

我使用的方法再次从内存中读取字符串(似乎正确工作):

String readStringFromFlash(int startAddr) {
  char in[128];
  char curIn;
  int i = 0;
  curIn = EEPROM.read(startAddr);
  for (; i < 128; i++) {
    curIn = EEPROM.read(startAddr + i);
    in[i] = curIn;
  }
  return String(in);
}
2个回答

3

你到底从哪里得到那个“LENGTH”宏的?太不可思议了。

在这里使用“sizeof”将无法达到你想要的效果。它是一个在编译时计算其参数存储需求的函数。在这种情况下,应该返回字符指针的长度(以字节为单位),而不是它所指向的字符串。

你应该使用strlen(),假设你的char*是一个正确终止的C字符串。再加上一个,以确保末尾的“\0”也被存储。

#define LENGTH(x) (strlen(x) + 1)

谢谢,现在它可以工作了。但是我认为sizeof(x)会给出数组的字节大小。这必须除以数组中数据类型的大小才能得到元素数量。 - DrEichenbach
如果你有 char string[23]; 那么 sizeof(string); 会返回23,即使您只存储了一个5个字符的字符串在字符数组中。如果您将 string 作为参数传递给一个函数并在函数内部使用 sizeof,则 (很可能是,这取决于 CPU) 您会得到4,因为函数只知道 char *sizeof 返回存储其参数所需的字节数。 - romkey
这在处理 String 时会变得非常糟糕 - 如果你执行 sizeof(String("verylongstring")),你将得到存储 String 对象所需的字节数,而不是分配给它存储数据的字节数。这经常会让人感到困扰。 - romkey

3
以下是演示在EEPROM(永久存储)中存储和检索字符串ssid的代码。
#include "EEPROM.h"

int addr = 0;
#define EEPROM_SIZE 64

// the sample text which we are storing in EEPROM
char ssid[64] = "CARNIVAL OF RUST";

void setup() {
    Serial.begin(115200);
    Serial.println("starting now...");

    if (!EEPROM.begin(EEPROM_SIZE)) {
        Serial.println("failed to init EEPROM");
        while(1);
    }

    // writing byte-by-byte to EEPROM
    for (int i = 0; i < EEPROM_SIZE; i++) {
        EEPROM.write(addr, ssid[i]);
        addr += 1;
    }
    EEPROM.commit();

    // reading byte-by-byte from EEPROM
    for (int i = 0; i < EEPROM_SIZE; i++) {
        byte readValue = EEPROM.read(i);

        if (readValue == 0) {
            break;
        }

        char readValueChar = char(readValue);
        Serial.print(readValueChar);
    }
}

void loop() {

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接