NodeMCU EEPROM, как определить, что ранее не было заданного значения - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь сохранить IP-адрес и пароль в EEPROM NODE MCU. Вот фрагмент кода. Проблема заключается в том, что в первый раз, когда я читаю, я получаю значения мусора, потому что не было значений, установленных ранее, так как мне определить, были ли значения, установленные ранее, чтобы я мог разместить значения по умолчанию.

#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:
}

1 Ответ

0 голосов
/ 19 июня 2020

У вас уже есть элемент magi c в вашей структуре, который вы можете проверить на его особое значение после чтения EEPROM.

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

Большинство приложений реализуют контрольную сумму не только для проверки неустановленных данных, но также и для измененных данных. Алгоритм зависит от ваших потребностей, но не придумывайте ничего нового, используйте известные, например CR C.

Изменить:

В зависимости от размера вашего магического c числа или контрольной суммы всегда будет небольшая вероятность того, что случайный набор битов будет распознан как правильный / инициализирован. При 32-битном значении эта вероятность никогда не может быть меньше 2 ^ (- 32), что составляет примерно 1 из 4 миллиардов.

Контрольная сумма имеет то преимущество перед значением magi c, что все значения равны учтено.

100% безопасности не бывает.

...