прошу помощи - не работает либа iniFile собрал на dataloger shield см.фото штатными средствами либы SD.h файлы создаются и пишутся скеч iniFile не работает - после iniFile ini(filename) -> затык ini.open() -> файл не найден средствами SD - он виден
"... На правой воротине сверху висела ржавая жестяная табличка: "Ул. Лукоморье, д. N_13, Н. К. Горыныч", а под нею красовался кусок фанеры с надписью чернилами вкривь и вкось: КОТ НЕ РАБОТАЕТ Администрация ... " Ну... Пока всё.
может чем поможет - но код почти один в один (либа 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() { }
А у вас точно первый символ в имени файла slash "/" ? Может написать проще, без спецсимволов Код (C++): const char filename[] = "net.ini";
const char filename[] = "net.ini"; const char filename[] = "/net.ini"; не работает - файла не существует
andy_maw, теме уже несколько дней. Может пора уже ... ну, если наскоком и тыком уж совсем никак не получается, так надо делать систематически и правильно? Нет? Библиотека эта? https://github.com/stevemarple/IniFile Или какая?
Что, не скажешь, какая библиотека? Ну, значит, действительно "Кот не работает", как тебе уже говорили.
Так будем отлаживаться "систематически и правильно" или "ну его нафиг?", а то если ты уже сдался, то мне пальцы об клавиатуру бить тоже незачем.
Лезь в файл IniFile.h и вставляй печати в сериал 1) между строками 149 и 150 вставь печать слова "Entry" 2) между строкам 151 и 152 вставь печать переменных _filename и _mode 3) между строками 152 и 153 вставь печать _file.name() Разумеется, номера строк текущие. По мере вставления печатей, они будут плыть. Посмотрим что там происходит, по результатам мож ещё чего напечатаем.
Хорошо, кстати, net.ini действительно есть и он в корне? Тогда лезем глубже. Открываем файл SD.cpp В нём ищем функцию "File SDClass: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"
Entry /net.ini 1 net.ini Point#1 Point#2 Point#3 ⸮14052019.dat Ini file /net.ini does not exist как то так
1. У меня там опечатка была. Надеюсь, Вы правильно поместили Point #3 там, где мой комментарий (4). Проверьте, так? 2. Удалите нафиг "/" 3. Перед строкой "return File(file, filepath);" Вставьте её Печать "Point #4" Давайте результат, думаю, ещё глубже лезть придётся. Файл то точно есть? Именно такой? Большие и маленькие буквы ... совсем такой?