Arduino ESP8266 EEPROM commit()返回false,无法保存SSID和密码
问题分析与修复方案
首先,导致EEPROM.commit()返回false最核心的问题是**EEPROM.begin(0)的参数错误**:
EEPROM.begin(size)函数需要传入你要使用的EEPROM总字节数,传入0的话,Arduino的EEPROM库不会初始化任何存储空间——后续的写入操作根本没有实际内存区域可以提交,所以commit必然失败。
接下来一步步修复你的代码:
1. 修正EEPROM初始化的大小
根据WiFi SSID(最长32字节)和密码(最长64字节)的标准上限,加上你需要存储的标志位(0xAA)、SSID长度、密码长度这3个额外字节,建议至少分配128字节的空间(留足冗余避免越界)。把初始化代码改成:
EEPROM.begin(128);
2. 修正地址计算错误
你的地址偏移逻辑存在错误,会导致存储空间浪费,极端情况下还可能触发越界问题:
- 写完SSID后,下一个存储密码长度的地址应该是
2 + ssidLength,而不是adress += ssidLength + 1(多加了1,空出了一个无用字节)。 - 存储密码时,起始地址应该是密码长度的地址+1,这个部分可以通过更清晰的地址变量来避免混乱。
修正后的writePROM()函数:
void writePROM() { // 初始化128字节的EEPROM空间 EEPROM.begin(128); // 写入标志位,用于后续验证是否有有效数据 EEPROM.write(0, 0xAA); byte ssidLength = ssid.length(); byte passLength = pass.length(); // 存储SSID长度到地址1 EEPROM.write(1, ssidLength); // 存储SSID到地址2开始的区域 for(int i = 0; i < ssidLength; i++) { EEPROM.write(2 + i, (byte)ssid[i]); } // 计算密码长度的存储地址:2 + SSID长度 int passLenAddr = 2 + ssidLength; EEPROM.write(passLenAddr, passLength); // 存储密码到密码长度地址+1的位置 for(int i = 0; i < passLength; i++) { EEPROM.write(passLenAddr + 1 + i, pass[i]); } bool bRc = EEPROM.commit(); if(bRc) { Serial.println("Write successfully"); } else { Serial.println("Write error"); } Serial.println("Write name to EEPROM = " + ssid); Serial.println("Write password to EEPROM = " + pass); }
3. 额外验证建议
为了确保数据写入正确,你可以在写完后添加一段读取代码,验证存储内容和写入的是否一致,比如:
// 验证函数示例 void readPROM() { EEPROM.begin(128); if(EEPROM.read(0) != 0xAA) { Serial.println("No valid data in EEPROM"); return; } byte ssidLen = EEPROM.read(1); String storedSSID = ""; for(int i=0; i<ssidLen; i++){ storedSSID += (char)EEPROM.read(2+i); } int passLenAddr = 2 + ssidLen; byte passLen = EEPROM.read(passLenAddr); String storedPass = ""; for(int i=0; i<passLen; i++){ storedPass += (char)EEPROM.read(passLenAddr+1+i); } Serial.println("Stored SSID: " + storedSSID); Serial.println("Stored Password: " + storedPass); }
其他注意事项
- 确保你的Arduino板支持EEPROM操作(大部分WiFi板比如ESP8266/ESP32都支持,但要确认库的兼容性)。
- 避免频繁写入EEPROM,因为EEPROM有写入寿命限制(通常几万次)。
内容的提问来源于stack exchange,提问作者Sadece Sadece
相关产品推荐
相关产品推荐

