【问题标题】:Error while writing/retrieving String in EEPROM在 EEPROM 中写入/检索字符串时出错
【发布时间】:2021-12-30 11:51:06
【问题描述】:

我在尝试在 ESP32 NodeMCU 板的 EEPROM 中写入和检索字符串时遇到问题。

我遵循了这个教程:https://roboticsbackend.com/arduino-write-string-in-eeprom/

这是我的代码:

#include <EEPROM.h>

void writeStringToEEPROM(int addrOffset, const String &strToWrite)
{
  byte len = strToWrite.length();
  EEPROM.write(addrOffset, len);
  for (int i = 0; i < len; i++)
  {
    EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
  }
}
String readStringFromEEPROM(int addrOffset)
{
  int newStrLen = EEPROM.read(addrOffset);
  char data[newStrLen + 1];
  for (int i = 0; i < newStrLen; i++)
  {
    data[i] = EEPROM.read(addrOffset + 1 + i);
  }
  data[newStrLen] = '\0'; // !!! NOTE !!! Remove the space between the slash "/" and "0" (I've added a space because otherwise there is a display bug)
  return String(data);
}

void setup() {
  Serial.begin(115200);
  Serial.println("-- Starting --");
  writeStringToEEPROM(0, "Hello Arduino");
  
  String retrievedString = readStringFromEEPROM(0);
  Serial.print("The String we read from EEPROM: ");
  Serial.println(retrievedString);
}

void loop() {}

这是输出:

ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
-- Starting --
The String we read from EEPROM: 

Serial.println(retrivedString) 返回是空白...

【问题讨论】:

  • esp32 上的 EEPROM 在闪存中模拟,这需要一些额外的命令,例如开始和提交。查看示例

标签: c arduino esp32 eeprom


【解决方案1】:

@Juraj 是对的,Arduino 和 ESP32 的 EEPROM.h 库是不同的。在使用该函数之前,您必须使用 begin() 初始化内存大小,并且 write 函数的工作方式类似于 update 函数。一旦你执行了 write 函数,你需要执行一个 commit()

#include <EEPROM.h>

#define EEPROM_SIZE 24

void writeStringToEEPROM(int addrOffset, const String &strToWrite)
{
  byte len = strToWrite.length();  
  EEPROM.write(addrOffset, len);
  delay(500);
  for (int i = 0; i < len; i++)
  {
    EEPROM.write(addrOffset + 1 + i, strToWrite[i]);
    delay(500);
  }
  EEPROM.commit();
}
String readStringFromEEPROM(int addrOffset)
{
  int newStrLen = EEPROM.read(addrOffset);
  char data[newStrLen + 1];
  for (int i = 0; i < newStrLen; i++)
  {
    data[i] = EEPROM.read(addrOffset + 1 + i);
  }
  data[newStrLen] = '\0';
  return String(data);
}

void setup() {
  Serial.begin(115200);
  EEPROM.begin(EEPROM_SIZE);
  Serial.println("-- Starting --");
  writeStringToEEPROM(0, "Hello Arduino");
  
  String retrievedString = readStringFromEEPROM(0);
  Serial.print("The String we read from EEPROM: ");
  Serial.println(retrievedString);
}

void loop() {}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多