You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266存储用户名到EEPROM后读取出现未知字符问题求助

问题分析与解决

你遇到的问题根源有两个:

  • 写入EEPROM时只存储了用户名的字符,没有在字符串末尾写入终止符'\0',导致读取时无法判断字符串结束位置。
  • ESP8266的EEPROM是用Flash模拟的,未初始化或未覆盖的地址会残留旧数据(不一定是'\0'),所以循环读取到后面时会读出未知乱码。

修正方案

1. 写入时补全终止符+清空旧数据

写完用户名的所有字符后,在紧接着的地址写入'\0'标记结束;同时建议先清空115-150的地址范围,彻底避免旧数据干扰。

2. 读取时增加双重判断

读取时不仅判断是否为'\0',还要限制最大读取地址(不超过150),防止越界读取无效数据。

修正后的代码

写入部分

String consumername = obj[String("USERNAME")];
Serial.println("writing eeprom > Consumer Name:");

// 先清空115-150地址范围,消除旧数据残留
for (int i = 115; i < 150; ++i) {
    EEPROM.write(i, '\0');
}

// 写入用户名内容,同时避免超出地址范围
for (int i = 0; i < consumername.length(); ++i) {
    int targetAddr = 115 + i;
    if (targetAddr >= 150) break; // 超过地址上限就停止写入
    EEPROM.write(targetAddr, consumername[i]);
    Serial.print("Wrote: ");
    Serial.println(consumername[i]);
}

// 在用户名末尾写入终止符(确保不越界)
int endAddr = 115 + consumername.length();
if (endAddr < 150) {
    EEPROM.write(endAddr, '\0');
}

EEPROM.commit(); // 必须调用该方法,才会把内存数据写入Flash

读取部分

String oname = "";
char ch;
for (int i = 115; i < 150; ++i) {
    ch = char(EEPROM.read(i));
    if (ch == '\0') break; // 遇到终止符立即停止读取
    oname += ch;
}
Serial.print("Name=");
Serial.println(oname);

关键注意点

  • ESP8266的EEPROM操作必须调用EEPROM.commit(),仅用write只是把数据存在内存缓存,不会真正写入Flash。
  • 分配的地址范围最多容纳35个字符(150-115),要确保用户名长度不超过这个限制,过长时建议做截断处理。

内容的提问来源于stack exchange,提问作者Yaseen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:20:33