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

如何判断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,求正确的判断方法。

解决方法

问题根源

  1. auth是栈上分配的数组,永远不可能等于NULL,所以auth == NULL的判断完全无效。
  2. 代码里的*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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:25:54