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

时间:2019-05-14 22:54:35

标签: arduino esp32 flash-memory eeprom

我想向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 个答案:

答案 0 :(得分:1)

您是从哪里获得LENGTH宏的?这是超现实的。

sizeof不会在这里执行您想要的操作。这是一个编译时函数,用于计算其参数的存储要求。在这种情况下,它应该返回字符指针的字节长度,而不是它指向的字符串。

您要使用strlen(),假设您的char *是正确终止的C字符串。添加一个以确保最后的“ \ 0”也被存储。

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

答案 1 :(得分:0)

下面的代码演示了如何在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");
        delay(1000000);
    }

    // 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() {

}