【发布时间】:2018-12-07 21:19:19
【问题描述】:
老实说,我在这里不知所措。我正在尝试在闪存 EEPROM 部分中存储用户通过发布请求发送的 SSID 和密码。为此,我将从 post 请求发送的数据转换为 char 数组并将其索引到 EEPROM。 SSID 运行没有任何问题,但密码在进入 EEPROM 之前总是以垃圾数据结尾。 这是有问题的代码:
// Recieve data from the HTTP server
void changeConfig(String parameter, String value){
int memoffset = 0;
if(parameter == "ssid")
memoffset = 0;
else if(parameter == "pass")
memoffset = 32;
else
return;
#ifdef DEBUG
Serial.println("Updating Data");
Serial.print("Param: ");
Serial.println(parameter);
Serial.print("Value: ");
Serial.println(value);
#endif
EEPROM.begin(64);
char _data[sizeof(value)];
value.toCharArray(_data, sizeof(value));
for(int i = memoffset; i < memoffset + sizeof(value); i++)
{
#ifdef DEBUG
Serial.print("addr ");
Serial.print(i);
Serial.print(" data ");
Serial.println(_data[i]);
#endif
EEPROM.write(i,_data[i]);
}
EEPROM.end();
}
串行监视器输出:
发布参数:ssid,值:NetworkName
更新数据
参数:ssid
值:网络名称
addr 0 数据 N
地址 1 数据 e
地址 2 数据 t
地址 3 数据 w
addr 4 数据 o
地址 5 数据 r
地址 6 数据 k
地址 7 数据 N
地址 8 数据 a
地址 9 数据 m
地址 10 数据 e
地址 11 数据 ␀
发布参数:pass,值:Networkpass
更新数据
参数:通过
价值:网络通行证
地址 32 数据 |
地址 33 数据 (
地址 34 数据 �
addr 35 数据?
addr 36 数据 L
地址 37 数据 ␛
地址 38 数据 �
addr 39 数据?
地址 40 数据 ␁
地址 41 数据 ␀
地址 42 数据 ␀
地址 43 数据 ␀
如您所见,当 POST 参数的名称为 ssid 时,它可以正常工作。另一方面,通过 pass ,字符数组只是充满了乱码。任何见解都会有所帮助。我在arduino环境中使用platformio。具有 1M 闪存的通用 ESP01。 提前致谢。
【问题讨论】:
-
我不确定 memoffset 应该做什么。当您打印 value 时,很明显它是写在那里没有任何偏移的。另外,我不知道“字符串”是什么,但我很难相信 sizeof() 是你需要的。
-
使用 memoffset 是因为 SSID 占用了 EEPROM 的前 32 个字节(0-31),而密码则占用了接下来的 32 个字节(32-63)。 String 是一个类,很像 char 数组,但它可以在没有大小的情况下进行初始化,它是接收到 POST 请求时从 HTTP 服务器回调返回的类型。 Size of 用于将字符串“转换”为 char 数组,因为这是写入 EEPROM 所需要的
-
但是您也在使用偏移量读取您的值!您我从偏移量开始,并且您正在访问偏移量处的值。这不可能。
-
@Daniel -- 您应该在调试输出中打印了
sizeof(value)。当您说char _data[sizeof(value)];时,这可能会让您更清楚地表明出了什么问题。您会看到,无论value包含什么字符串数据,sizeof都不会改变。