Чтение настроек с microSD

Я изменил скетч SD для ESP8266, чтобы он считывал настройки WIFI из файла с именем CONFIG.TXT. Формат содержимого текстового файла: SETTING=VALUE. Пример.

SSID=AP001
KEY=AP001

Мне удается разделить SETTING и VALUE Мой код:

#include <SPI.h>
#include <SD.h>

File myFile;

void readWifiConfig() {
  Serial.println("Initializing SD card...");
  char temp;
  bool isSetting = true;
  if (!SD.begin(4)) {
    Serial.println("Initialization failed!");
    return;
  }
  Serial.println("Initialization done.");
  myFile = SD.open("CONFIG.TXT");
  if (myFile) {
    Serial.println("CONFIG.TXT");
    while (myFile.available()) {
      temp = myFile.read();
      if (isSetting == true) {
        if (temp == '=') {
          Serial.print("="); //Записываем '=' в консоль
          isSetting  = false;
        }
        else {
          Serial.print(temp); //Записываем часть SETTING в консоль
        }
      }
      else {
        if (temp == '\n' || temp == '\r') {
          isSetting = true;
          }
        else {
          Serial.print(temp); //Записывает часть VALUE в консоль
          }
        }
    }
    myFile.close();
  } else {
    Serial.println("Can't open CONFIG.TXT");
  }
}

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin(115200);
  delay(10);
  readWifiConfig();
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:

}

Выход:

Initializing SD card...
Initialization done.
CONFIG.TXT
SSID=AP001
KEY=AP001

Я хочу записать значения в соответствующие переменные, но не знаю как.

char* ssid;
char* key;

, 👍0

Обсуждение

Я не вижу вопроса, @Michel Keijzers

Вы не можете просто написать в указатель, вам нужно выделить буфер и скопировать туда данные., @Chris Stratton


3 ответа


Лучший ответ:

0

Новый улучшенный код.

Формат файла:

$SETTINGNAME=SETTINGVALUE;

Новый код:

#include <SPI.h>
#include <SD.h>

File configFile;
uint8_t filePosition;
uint8_t workingIndex = 0;
uint8_t settingNameValuePositions[16][3];
uint8_t temporaryBufferPosition = 0;
char temporaryBuffer[32];

void setPosition(uint8_t mrk) {
  settingNameValuePositions[workingIndex][mrk] = filePosition;
}

uint8_t getPosition(uint8_t idx, uint8_t mrk) {
  return settingNameValuePositions[idx][mrk];
}

void addToBuffer(char inp) {
  temporaryBuffer[temporaryBufferPosition] = inp;
  temporaryBufferPosition++;
}

void resetBuffer() {
  temporaryBufferPosition = 0;
  memset(temporaryBuffer, 0, sizeof(temporaryBuffer));
}

char* requestSetting(char *settingName) {
  for (int i = 0; i < workingIndex; i++) {
    uint8_t nS = getPosition(i,0); //$
    uint8_t eQ = getPosition(i,1); //=
    uint8_t vE = getPosition(i,2); //;
    bool isFound = false;
    resetBuffer();
    for (int g = nS; g < eQ - 1; g++) {
      configFile.seek(g);
      addToBuffer(configFile.read());
    }
    if (strcmp(temporaryBuffer,settingName) == 0) {
      isFound = true;
      resetBuffer();
    }
    for (int g = eQ; g < vE - 1; g++) {
      configFile.seek(g);
      addToBuffer(configFile.read());
    }
    if (isFound) {
      isFound = false;
      return temporaryBuffer;
    }
  }
  return "0";
}

bool readConfigFile(char* fileName) {
  //Serial.println("ИНИЦИАЛИЗАЦИЯ SD-КАРТЫ");
  if (!SD.begin()) {
    //Serial.println("ОШИБКА ИНИЦИАЛИЗАЦИИ SD-КАРТЫ");
    return false;
  }
  else {
    //Serial.println("ИНИЦИАЛИЗАЦИЯ SD-КАРТЫ ЗАВЕРШЕНА");
    //Serial.println("ОТКРЫТИЕ ФАЙЛА: " + String(fileName));
    configFile = SD.open(fileName);
    if (!configFile) {
      //Serial.println("ОШИБКА ОТКРЫТИЯ ФАЙЛА: " + String(fileName));
      return false;
    }
    else {
      //Serial.println("ФАЙЛ " + имя_файла + " ОТКРЫТО");
      //Serial.println("ПОИСК ПОЗИЦИИ МАРКЕРА");
      while (configFile.available()) {
        char fileChar = configFile.read();
        filePosition = configFile.position();
        switch (fileChar) {
          case '$':
            setPosition(0);
            break;
          case '=':
            setPosition(1);
            break;
          case ';':
            setPosition(2);
            workingIndex++;
        }
      }
    }
    return true;
  }
}

void setup() {
  Serial.begin(115200);
  readConfigFile("CONFIG.TXT"); //ИМЯ ФАЙЛА
  Serial.println(requestSetting("SETTINGNAME"));
}
void loop() {
}
,

0

Как-то мне удалось это сделать, но мой код неоптимизирован. Пожалуйста, дайте мне знать, если я сделал что-то плохое.

Я изменил формат контента на этот, так мне стало намного проще. (CONFIG.TXT)

SSID%&WIFIAP001&%KEY%&PASS1234&

Новый код.

#include <SPI.h>
#include <SD.h>

File myFile;
char wifiSsid[63];
char wifiKey[63];
char temp;
char settingSsid[5] = "SSID";
char settingKey[4] = "KEY";
char settingTemp[10];
char valueTemp[63];
int settingTempLastPos = 0;
int valueTempLastPos = 0;
int percentCount = 0;
int andCount = 0;
bool isSetting = true;
bool ssidValueFound = false;
bool keyValueFound = false;

void readWifiConfig() {
  Serial.println("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("Initialization failed!");
    return;
  }
  Serial.println("Initialization done.");
  myFile = SD.open("CONFIG.TXT");
  if (myFile) {
    Serial.println("CONFIG.TXT");
    while (myFile.available()) {
      temp = myFile.read();
      if (temp == '%') {
        percentCount++;
        isSetting = true;
        if (percentCount == 2) {
          //Serial.println(settingTemp);
          if (strcmp(settingSsid,settingTemp) == 0) {
            Serial.println("SSID SETTING FOUND");
            //ЕСЛИ ОБНАРУЖЕНЫ, ПОДНИМИТЕ ФЛАГ ДЛЯ ДОБАВЛЕНИЯ ЗНАЧЕНИЯ К МАССИВУ СИМВОЛОВ SSID
            ssidValueFound = true;
            }
          else if (strcmp(settingKey,settingTemp) == 0) {
            Serial.println("KEY SETTING FOUND");
            //ЕСЛИ ОБНАРУЖЕНЫ, ПОДНИМИТЕ ФЛАГ ДЛЯ ДОБАВЛЕНИЯ ЗНАЧЕНИЯ К МАССИВУ СИМВОЛОВ SSID
            keyValueFound = true;
            }
          memset(&settingTemp[0], 0, sizeof(settingTemp));
          settingTempLastPos = 0;
          percentCount = 0;
        }
      }
      else if (temp == '&') {
        andCount++;
        isSetting = false;
        if (andCount == 2) {
          //Serial.println(valueTemp);
          if (ssidValueFound) {
            //Serial.println(valueTemp);
            memcpy(wifiSsid,valueTemp,63);
            //Serial.println(wifiSsid);
            ssidValueFound = false;
            }
          else if (keyValueFound) {
            //Serial.println(valueTemp);
            memcpy(wifiKey,valueTemp,63);
            //Serial.println(wifiKey);
            keyValueFound = false;
            }
          memset(&valueTemp[0], 0, sizeof(valueTemp));
          valueTempLastPos = 0;
          andCount = 0;
        }
      }
      else {
        if (isSetting == true) { //настройка
          settingTemp[settingTempLastPos] = temp;
          settingTempLastPos++;
        }
        else if (isSetting == false) { //значение
          valueTemp[valueTempLastPos] = temp;
          valueTempLastPos++;
        }
      }
    }
    //Serial.println(settingTemp);
    myFile.close();
  } else {
    Serial.println("Can't open CONFIG.TXT");
  }
}

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin(115200);
  delay(10);
  readWifiConfig();
  Serial.println(wifiSsid);
  Serial.println(wifiKey);
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:

}

Выход:

Initializing SD card...
Initialization done.
CONFIG.TXT
SSID SETTING FOUND
KEY SETTING FOUND
WIFIAP001
PASS1234
,

0
uint8_t settingNameValuePositions[16][3];

Если у вас более 16 переменных, это приведет к сбою вашего веб-сервера.

Если ваш файл конфигурации содержит более 256 символов, вам следует использовать short вместо uint8_t.

,