iniFile

Тема в разделе "Arduino & Shields", создана пользователем andy_maw, 10 май 2019.

  1. andy_maw

    andy_maw Нуб

    прошу помощи - не работает либа iniFile
    собрал на dataloger shield см.фото
    штатными средствами либы SD.h файлы создаются и пишутся
    скеч iniFile не работает - после iniFile ini(filename) -> затык ini.open() -> файл не найден
    средствами SD - он виден
     

    Вложения:

  2. ratman

    ratman Нерд

    "...
    На правой воротине сверху висела ржавая жестяная табличка: "Ул. Лукоморье, д. N_13, Н. К. Горыныч", а под нею красовался кусок фанеры с надписью чернилами вкривь и вкось:

    КОТ НЕ РАБОТАЕТ

    Администрация
    ...

    "
    Ну... Пока всё.
     
    DetSimen нравится это.
  3. b707

    b707 Гуру

    andy_maw - выложите свой код
     
  4. andy_maw

    andy_maw Нуб

    может чем поможет - но код почти один в один (либа iniFile 1.2.1)

    Код (C++):

    #include <SD.h>

    #include <SPI.h>
    #include <IPAddress.h>
    #include <IniFile.h>

    // The select pin used for the SD card
    //#define SD_SELECT 4
    #define SD_SELECT 10             //поставил 10 вместо 22
    //#define ETHERNET_SELECT 10   //закоментировал

    void printErrorMessage(uint8_t e, bool eol = true)
    {
      switch (e) {
      case IniFile::errorNoError:
        Serial.print("no error");
        break;
      case IniFile::errorFileNotFound:
        Serial.print("file not found");
        break;
      case IniFile::errorFileNotOpen:
        Serial.print("file not open");
        break;
      case IniFile::errorBufferTooSmall:
        Serial.print("buffer too small");
        break;
      case IniFile::errorSeekError:
        Serial.print("seek error");
        break;
      case IniFile::errorSectionNotFound:
        Serial.print("section not found");
        break;
      case IniFile::errorKeyNotFound:
        Serial.print("key not found");
        break;
      case IniFile::errorEndOfFile:
        Serial.print("end of file");
        break;
      case IniFile::errorUnknownError:
        Serial.print("unknown error");
        break;
      default:
        Serial.print("unknown error value");
        break;
      }
      if (eol)
        Serial.println();
    }

    void setup()
    {
      // Configure all of the SPI select pins as outputs and make SPI
      // devices inactive, otherwise the earlier init routines may fail
      // for devices which have not yet been configured.
      pinMode(SD_SELECT, OUTPUT);
      digitalWrite(SD_SELECT, HIGH); // disable SD card
     
      //pinMode(ETHERNET_SELECT, OUTPUT);
      //digitalWrite(ETHERNET_SELECT, HIGH); // disable Ethernet

      const size_t bufferLen = 80;
      char buffer[bufferLen];

      const char *filename = "/net.ini";
      Serial.begin(9600);
      SPI.begin();

    // это работает
      if (!SD.begin(SD_SELECT))
        while (1)
          Serial.println("SD.begin() failed");
     
      IniFile ini(filename);
    //далее не работает пишет файл не найден
      if (!ini.open()) {
        Serial.print("Ini file ");
        Serial.print(filename);
        Serial.println(" does not exist");
        // Cannot do anything else
        while (1)
          ;
      }
      Serial.println("Ini file exists");

      // Check the file is valid. This can be used to warn if any lines
      // are longer than the buffer.
      if (!ini.validate(buffer, bufferLen)) {
        Serial.print("ini file ");
        Serial.print(ini.getFilename());
        Serial.print(" not valid: ");
        printErrorMessage(ini.getError());
        // Cannot do anything else
        while (1)
          ;
      }
     
      // Fetch a value from a key which is present
      if (ini.getValue("network", "mac", buffer, bufferLen)) {
        Serial.print("section 'network' has an entry 'mac' with value ");
        Serial.println(buffer);
      }
      else {
        Serial.print("Could not read 'mac' from section 'network', error was ");
        printErrorMessage(ini.getError());
      }
     
      // Try fetching a value from a missing key (but section is present)
      if (ini.getValue("network", "nosuchkey", buffer, bufferLen)) {
        Serial.print("section 'network' has an entry 'nosuchkey' with value ");
        Serial.println(buffer);
      }
      else {
        Serial.print("Could not read 'nosuchkey' from section 'network', error was ");
        printErrorMessage(ini.getError());
      }
     
      // Try fetching a key from a section which is not present
      if (ini.getValue("nosuchsection", "nosuchkey", buffer, bufferLen)) {
        Serial.print("section 'nosuchsection' has an entry 'nosuchkey' with value ");
        Serial.println(buffer);
      }
      else {
        Serial.print("Could not read 'nosuchkey' from section 'nosuchsection', error was ");
        printErrorMessage(ini.getError());
      }

      // Fetch a boolean value
      bool allowPut; // variable where result will be stored
      bool found = ini.getValue("/upload", "allow put", buffer, bufferLen, allowPut);
      if (found) {
        Serial.print("The value of 'allow put' in section '/upload' is ");
        // Print value, converting boolean to a string
        Serial.println(allowPut ? "TRUE" : "FALSE");
      }
      else {
        Serial.print("Could not get the value of 'allow put' in section '/upload': ");
        printErrorMessage(ini.getError());
      }
    }


    void loop()
    {


    }
     
     
  5. b707

    b707 Гуру

    попробуйте описать имя файла так:

    const char filename[] = "/net.ini";
     
  6. ZAZ-965

    ZAZ-965 Гуру

    А у вас точно первый символ в имени файла slash "/" ? Может написать проще, без спецсимволов
    Код (C++):
    const char filename[] = "net.ini";
     
  7. andy_maw

    andy_maw Нуб

    const char filename[] = "net.ini";
    const char filename[] = "/net.ini";
    не работает - файла не существует
     
  8. andy_maw

    andy_maw Нуб

    может не работает с ФАТ32 - хотя это ни где не указано
     
  9. fogary

    fogary Гик

    А как в примере к библиотеке не пробовали:
    Код (C++):
    char testIniFilename[] = "test.ini";
     
  10. andy_maw

    andy_maw Нуб

    char filename[] = "net.ini";
    не работает
    может у кого есть рабочая библа?
     
    Последнее редактирование: 14 май 2019
  11. Asper Daffy

    Asper Daffy Иксперд

    andy_maw, теме уже несколько дней. Может пора уже ... ну, если наскоком и тыком уж совсем никак не получается, так надо делать систематически и правильно? Нет?

    Библиотека эта? https://github.com/stevemarple/IniFile

    Или какая?
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Что, не скажешь, какая библиотека? Ну, значит, действительно "Кот не работает", как тебе уже говорили.
     
    DetSimen нравится это.
  13. andy_maw

    andy_maw Нуб

    выше писал - она самая
    жаль что не работает (у меня) - а я размечтался о кренделях небесных :)
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Так будем отлаживаться "систематически и правильно" или "ну его нафиг?", а то если ты уже сдался, то мне пальцы об клавиатуру бить тоже незачем.
     
  15. andy_maw

    andy_maw Нуб

    'слаб' я в сях, но желание к подвигам есть !
    куда и что копать дальше ?
     
  16. Asper Daffy

    Asper Daffy Иксперд

    Лезь в файл IniFile.h и вставляй печати в сериал
    1) между строками 149 и 150 вставь печать слова "Entry"
    2) между строкам 151 и 152 вставь печать переменных _filename и _mode
    3) между строками 152 и 153 вставь печать _file.name()

    Разумеется, номера строк текущие. По мере вставления печатей, они будут плыть. Посмотрим что там происходит, по результатам мож ещё чего напечатаем.
     
    b707 и DetSimen нравится это.
  17. andy_maw

    andy_maw Нуб

    Entry
    /net.ini
    1
    ⸮14052019.dat
    Ini file /net.ini does not exist

    вот что выдало ^^^
     
    Последнее редактирование: 14 май 2019
  18. Asper Daffy

    Asper Daffy Иксперд

    Хорошо, кстати, net.ini действительно есть и он в корне?

    Тогда лезем глубже. Открываем файл SD.cpp В нём ищем функцию "File SDClass::eek:pen(const char *filepath, uint8_t mode)". Она выглядит вот так (комментарии, начинающиеся с ////// вставил я для ссылок):
    Код (C++):
    File SDClass::open(const char *filepath, uint8_t mode) {
      /*

         Open the supplied file path for reading or writing.

         The file content can be accessed via the `file` property of
         the `SDClass` object--this property is currently
         a standard `SdFile` object from `sdfatlib`.

         Defaults to read only.

         If `write` is true, default action (when `append` is true) is to
         append data to the end of the file.

         If `append` is false then the file will be truncated first.

         If the file does not exist and it is opened for writing the file
         will be created.

         An attempt to open a file for reading that does not exist is an
         error.

       */


      int pathidx;

      // do the interative search
      SdFile parentdir = getParentDir(filepath, &pathidx);
      // no more subdirs!

      filepath += pathidx;
    ////// (1)
      if (! filepath[0]) {
        // it was the directory itself!
        return File(parentdir, "/");
      }
    ////// (2)
      // Open the file itself
      SdFile file;

      // failed to open a subdir!
      if (!parentdir.isOpen())
        return File();
    ////// (3)
      if ( ! file.open(parentdir, filepath, mode)) {
        return File();
      }
      // close the parent
      parentdir.close();
    ////// (4)
      if ((mode & (O_APPEND | O_WRITE)) == (O_APPEND | O_WRITE))
        file.seekSet(file.fileSize());
      return File(file, filepath);
    }
     

    Вместо моих комментариев вставляем печати
    (1) - печатаем filepath
    (2) - печатаем строку "Point #1"
    (3) - печатаем строку "Point #2"
    (3) - печатаем строку "Point #3"
     
  19. andy_maw

    andy_maw Нуб

    Entry
    /net.ini
    1
    net.ini
    Point#1
    Point#2
    Point#3
    ⸮14052019.dat
    Ini file /net.ini does not exist

    как то так
     
  20. Asper Daffy

    Asper Daffy Иксперд

    1. У меня там опечатка была. Надеюсь, Вы правильно поместили Point #3 там, где мой комментарий (4). Проверьте, так?

    2. Удалите нафиг "/"

    3. Перед строкой "return File(file, filepath);" Вставьте её Печать "Point #4"

    Давайте результат, думаю, ещё глубже лезть придётся.

    Файл то точно есть? Именно такой? Большие и маленькие буквы ... совсем такой?