如何判断char数组auth是初始空状态还是已被EEPROM输入修改?
问题
我开发了一款应用,可将输入文本保存至EEPROM,每次启动时从EEPROM读取数据。以下是读取EEPROM、拆分数据并打印各部分内容的代码:
char auth[32]=""; char userNameKey[32]=""; String abcd; EEPROM.begin(512); { wwww = wwww + char(EEPROM.read(0x06+i)); //Read one by one with starting address of 0x0F } String zzz; String uuuu; for(int i=0;i<32;i++) {uuuu = uuuu + char(EEPROM.read(0x50+i)); } String yyyy = userNameKey; String vvvv; for(int i=0;i<33;i++) {vvvv = vvvv + char(EEPROM.read(0x90+i)); } wwww.toCharArray(auth,33); Serial.println("Auth"); Serial.print(auth); Serial.println("this"); Serial.print(wwww); abcd = wwww; Serial.println("that"); Serial.print(uuuu); Serial.println("those"); Serial.print(vvvv); int firstCommaIndex = uuuu.indexOf(','); String dateOffset = uuuu.substring(0, firstCommaIndex); Serial.println("most"); Serial.print(dateOffset); int firstCommaIndexa = vvvv.indexOf(','); String wstemp = vvvv.substring(0, firstCommaIndexa); TRIPPER = wstemp; WIFIER = wstemp; int len = firstCommaIndexa; wstemp.toCharArray(userr,len+1); Serial.println("some"); Serial.print(wstemp);
无输入时串口打印乱码,有输入时能正常打印内容。我需要判断char数组auth是处于初始的char auth[32]=""状态,还是已被修改为包含输入文本的状态。
我尝试了以下代码:
if (auth == NULL) { Serial.print ("auth empty"); } if (*auth = '/0'){ Serial.print ("auth /0"); }
但无论有无输入,都会输出auth /0,求正确的判断方法。
解决方法
问题根源
auth是栈上分配的数组,永远不可能等于NULL,所以auth == NULL的判断完全无效。- 代码里的
*auth = '/0'是赋值操作,不是比较判断,正确的写法应该是*auth == '\0'(注意用双等号和反斜杠)。但即使修正,这个判断也不准确——因为从EEPROM读取的内容如果开头就是\0,也会触发判断,无法区分初始状态和无效数据。
正确判断方案
方案1:用标志位区分EEPROM是否被初始化
在EEPROM的固定位置(比如地址0)写入一个特定标志(比如0xAA),启动时先读取这个标志:
- 标志不存在:说明是首次启动,
auth处于初始状态。 - 标志存在:再读取
auth的内容并验证。
写入时的代码示例:
// 写入数据前先设置初始化标志 EEPROM.write(0, 0xAA); // 写入auth内容到对应地址 int authLen = strlen(auth); for (int i = 0; i < authLen; i++) { EEPROM.write(0x06 + i, auth[i]); } // 写入字符串终止符,避免读取乱码 EEPROM.write(0x06 + authLen, '\0'); EEPROM.commit();
读取时的判断代码:
EEPROM.begin(512); if (EEPROM.read(0) != 0xAA) { Serial.println("auth处于初始状态"); } else { String wwww; for (int i = 0; i < 32; i++) { char c = char(EEPROM.read(0x06 + i)); if (c == '\0') break; // 遇到终止符停止读取 wwww += c; } wwww.toCharArray(auth, 33); if (strlen(auth) == 0) { Serial.println("EEPROM已初始化,但auth为空"); } else { Serial.println("auth有有效数据"); } }
方案2:直接验证auth内容(简化版)
如果不需要严格区分“从未写入”和“写入了空数据”,可以直接检查auth的长度:
wwww.toCharArray(auth, 33); if (strlen(auth) == 0) { Serial.println("auth为空(初始状态或无有效数据)"); } else { Serial.println("auth包含有效数据"); }
额外优化建议
- 读取EEPROM字符串时,遇到
\0立即停止,避免读取多余的垃圾字符。 - 写入EEPROM时必须添加字符串终止符
\0,保证读取的内容是合法的C风格字符串。
内容的提问来源于stack exchange,提问作者user1114881
相关产品推荐
相关产品推荐

