将字符串写入 Arduino ESP32 的永久闪存
Write String to permanent flash memory of Arduino 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, '[=10=]');
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);
}
你到底从哪里得到那个 LENGTH
宏的?这是超现实的。
sizeof
不会在这里做你想做的。它是一个 compile-time 函数,用于计算其参数的存储要求。在这种情况下,它应该 return 字符指针的字节长度,而不是它指向的字符串。
您想使用 strlen(),假设您的 char* 是正确终止的 C 字符串。添加一个以确保末尾的“\0”也被存储。
#define LENGTH(x) (strlen(x) + 1)
下面的代码演示了在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() {
}
我想将一些文本写入 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, '[=10=]');
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);
}
你到底从哪里得到那个 LENGTH
宏的?这是超现实的。
sizeof
不会在这里做你想做的。它是一个 compile-time 函数,用于计算其参数的存储要求。在这种情况下,它应该 return 字符指针的字节长度,而不是它指向的字符串。
您想使用 strlen(),假设您的 char* 是正确终止的 C 字符串。添加一个以确保末尾的“\0”也被存储。
#define LENGTH(x) (strlen(x) + 1)
下面的代码演示了在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() {
}