Странное поведение функций

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Доброго времени суток уважаемые!

Наблюдаю следующие странности, не пойму в чем дело...

Может кто-то мне объяснит, в чем ошибка.

Создал 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 аналогично - ничего...

Какие у кого мысли?

diger67
Offline
Зарегистрирован: 25.07.2015

Скорее всего дело в зоне видимости какойто переменной. У вас не открывается файл. Сравните значения confFile в обоих случаях, для чего вам монитор. Если эта переменная пинимает разные значения, то надо искать почему присваивается неправильное значение и как ее объявить правильно.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Была у меня хрень, когда файл создавался , вроде как писался, все фунциклировадо прекрасно, только файл был пустой. И продолжалась эта шняга на двух SD шильдиках часа два, пока не проверил этот же код с сдшкой из W5100 шильда. Там все оказалось нормально. А первые два шильда оба в помойку. Мне потом продавец ибээвский деньги вернул , хотя срок по плохому отзыву уже прошел.

на всякий случай : шильд был такой.