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

DrE*_*ach 5 arduino flash-memory eeprom esp32

我想将一些文本写入 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();
}
Run Code Online (Sandbox Code Playgroud)

我的电话

writeString("TEST_STRING_TO_WRITE", 0);
Run Code Online (Sandbox Code Playgroud)

只将 TEST 写入内存。我不懂为什么。是因为_吗?或者我错过了一些不同的东西?

这是使用的 LENGTH 宏

#define LENGTH(x) (sizeof(x)/sizeof(x[0]))
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

rom*_*key 3

你到底从哪里得到这个LENGTH宏?它\xe2\x80\x99s超现实。

\n\n

sizeof不会在这里做你想做的事。它\xe2\x80\x99是一个编译时函数,用于计算其参数的存储要求。在这种情况下,它应该返回字符指针的字节长度,而不是它指向的字符串。

\n\n

您想使用 strlen(),假设您的 char* 是正确终止的 C 字符串。添加一个以确保末尾的 \xe2\x80\x98\\0\xe2\x80\x99 也被存储。

\n\n
#define LENGTH(x) (strlen(x) + 1)\n
Run Code Online (Sandbox Code Playgroud)\n