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
相关产品推荐
相关产品推荐

