Странное поведение функций
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемые!
Наблюдаю следующие странности, не пойму в чем дело...
Может кто-то мне объяснит, в чем ошибка.
Создал 2 скетчка проекта - в одном Setup и Loop, в другом лежат функции
Первый имеет вид
SH.ino
#include <SoftwareSerial.h> #include <SPI.h> #include <SD.h> void setup(void) { Serial.begin(9600); InitSD(); if (ReadConfFile()) { Serial.println("CONFIG SUCCESS READ"); } CreateConfigFileSD(); } void loop(void) { delay(1000); }
Вызываю функцию проверки SD карты и наличия на нем файла конфига, далее читаю данные из конфига и после этого хочу вызвать функцию, которая удалит старый файл и создаст новый
Скетч
SH_Func.ino
static char* CONFIG_FILE_NAME = "config.ini"; static char* CONFIGTMP_FILE_NAME = "config_tmp.ini"; void InitSD(void) { Serial.println("Initializing SD card:"); if (!SD.begin(4)) { Serial.println("ERROR - SD card initialization failed!"); return; } Serial.println("SUCCESS - SD card initialized."); // проверяем наличие файлов на карте if (!SD.exists(CONFIG_FILE_NAME)) { Serial.println("ERROR - Can't find " + String(CONFIG_FILE_NAME) + " file!"); return; } Serial.println("SUCCESS - Found " + String(CONFIG_FILE_NAME) + " file."); if (!SD.exists(CONFIGTMP_FILE_NAME)) { Serial.println("ERROR - Can't find " + String(CONFIGTMP_FILE_NAME) + " file!"); return; } Serial.println("SUCCESS - Found " + String(CONFIGTMP_FILE_NAME) + " file."); } // Читаем файл конфига с карты памяти при каждой загрузке системы boolean ReadConfFile() { IniFile ini(CONFIG_FILE_NAME); if (!ini.open()) { Serial.print("Ini file "); Serial.print(CONFIG_FILE); Serial.println(" does not exist"); } else if (!ini.validate(bufConf, bufferLen)) { Serial.print("ini file "); Serial.print(ini.getFilename()); Serial.print(" not valid: "); PrintErrorMessage(ini.getError()); } else if (WriteGeneralInfoStruct(ini)) { return true; } return false; } //Функция удаляет старый файл конфига с карты памяти и собирает, пробегаясь по структурам void CreateConfigFileSD() { Serial.println("CREATE CONFIG FILE START..."); File confFile; if (SD.exists(CONFIG_FILE_NAME)) { Serial.println("FOUND CONFIG.INI FILE"); confFile = SD.open(CONFIGTMP_FILE_NAME, FILE_WRITE);// open file if (confFile) { Serial.println("CREATE CONFIG_TMP.INI FILE SUCCESS"); WriteDataToFile(confFile); SD.remove(CONFIG_FILE_NAME); confFile.close(); } else Serial.println("CREATE CONFIG_TMP.INI FILE FAIL"); return; } else if (SD.exists(CONFIGTMP_FILE_NAME)) { Serial.println("FOUND CONFIG_TMP.INI FILE"); confFile = SD.open(CONFIG_FILE_NAME, FILE_WRITE);// open file if (confFile) { Serial.println("CREATE CONFIG.INI FILE SUCCESS"); WriteDataToFile(confFile); SD.remove(CONFIGTMP_FILE_NAME); confFile.close(); } else Serial.println("CREATE CONFIG.INI FILE FAIL"); return; } }
Первые 2 функции отрабатываю на отлично, в сериале вижу соответствующие сообщения, но вот функция создания файла никак не хочет отрабатывать, доходит до этого места
//Функция удаляет старый файл конфига с карты памяти и собирает, пробегаясь по структурам void CreateConfigFileSD() { Serial.println("CREATE CONFIG FILE START..."); File confFile; if (SD.exists(CONFIG_FILE_NAME)) { Serial.println("FOUND CONFIG.INI FILE"); confFile = SD.open(CONFIGTMP_FILE_NAME, FILE_WRITE);// open file if (confFile) {
и вываливается в else...попросту не хочет создавать файл на карте памяти новый и его писать...
грешил на карту памяти и прочее, но начал тестить другим подходом, если пихаю код создания нового файла непосредственно сюда в setup в основном файле скетча
void setup(void) { Serial.begin(9600); InitSD(); if (ReadConfFile()) { Serial.println("CONFIG SUCCESS READ"); Serial.println("CREATE CONFIG FILE START..."); File confFile; if (SD.exists(CONFIG_FILE_NAME)) { Serial.println("FOUND CONFIG.INI FILE"); confFile = SD.open(CONFIGTMP_FILE_NAME, FILE_WRITE);// open file if (confFile) { Serial.println("CREATE CONFIG_TMP.INI FILE SUCCESS"); WriteDataToFile(confFile); SD.remove(CONFIG_FILE_NAME); confFile.close(); } else Serial.println("CREATE CONFIG_TMP.INI FILE FAIL"); return; } } }
ВСЕ ЗАПИСЫВАЕТСЯ ПРЕКРАСНО - находит старый файл, создает новый, пишет туда данные и удаляет старый,
ПРИЧЕМ функции которые отрабатывают первые и находятся так же во втором скетче работают без нареканий...
В чем может быть проблема?
Так же переносил функцию создания файла в основной скетч и это не дало никаких результатов - файл не создается, пытался вызвать ее так же из Loop аналогично - ничего...
Какие у кого мысли?
Скорее всего дело в зоне видимости какойто переменной. У вас не открывается файл. Сравните значения confFile в обоих случаях, для чего вам монитор. Если эта переменная пинимает разные значения, то надо искать почему присваивается неправильное значение и как ее объявить правильно.
Была у меня хрень, когда файл создавался , вроде как писался, все фунциклировадо прекрасно, только файл был пустой. И продолжалась эта шняга на двух SD шильдиках часа два, пока не проверил этот же код с сдшкой из W5100 шильда. Там все оказалось нормально. А первые два шильда оба в помойку. Мне потом продавец ибээвский деньги вернул , хотя срок по плохому отзыву уже прошел.
на всякий случай : шильд был такой.