NodeMCU EEPROM如何确定之前没有设置的值



我正在尝试将IP地址和密码保存在NODE MCU EEPROM。这是代码片段。 问题是我第一次阅读时,我得到了垃圾值,因为之前没有设置值,所以我如何确定之前是否设置了值,以便我可以放置默认值。

#include <Arduino.h>
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
const char* ssid_default = "NodeMCU";
const char* pass_default = "1234";
uint addr = 0;
ESP8266WebServer server(80);
struct
{
int was_set = 9090; // already Set = 9090, other numbers  =  not set
char ssid_default[40] = "NODEMCU";
char pass_default[40] = "1234";
int step = 0;
/* data */
}creds;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
EEPROM.begin(512);
delay(5000);
EEPROM.get(addr, creds);
Serial.print("Default SSID: ");
Serial.println(String(creds.ssid_default));
Serial.print("Default Pass:");
Serial.println(String(creds.pass_default));
Serial.print("Times Executed: ");
Serial.println(String(creds.step));
creds.step = creds.step + 1;
EEPROM.put(addr, creds);
Serial.println("Times Executed Incremented, Re-plug Devise to see changes");
EEPROM.commit();
}
void loop() {
delay(1000);
// put your main code here, to run repeatedly:
}

您的结构中已经有一个魔术元素,您可以在阅读EEPROM后检查其特殊值。

/*...*/
EEPROM.get(addr, creds);
if (creds.was_set != 9090) {
/* set default values */
}
/*...*/

大多数应用程序实现校验和,不仅检查未设置的数据,还检查更改的数据。该算法取决于您的需求,但不要发明新的东西,请使用CRC等知名算法。

>编辑:

根据您的幻数或校验和的大小,随机一组位被识别为正确/初始化的可能性总是很小。对于 32 位值,此概率永远不会小于 2^(-32(,即大约 4 亿分之一。

与魔术值相比,校验和的优势在于考虑了所有值。

没有100%安全这样的事情。

相关内容

  • 没有找到相关文章

最新更新