Странное поведение функций
- Войдите на сайт для отправки комментариев
Доброго времени суток уважаемые!
Наблюдаю следующие странности, не пойму в чем дело...
Может кто-то мне объяснит, в чем ошибка.
Создал 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 шильда. Там все оказалось нормально. А первые два шильда оба в помойку. Мне потом продавец ибээвский деньги вернул , хотя срок по плохому отзыву уже прошел.
на всякий случай : шильд был такой.