Библиотека SD.h

Yurchik26
Offline
Зарегистрирован: 16.03.2013

Всем добрый день. Столкнулся с интересной особенностью, хотелось бы понять в чем дело. Есть мой большой скетч (его не прикладываю т.к. он очень большой, сделал вырезку из него чтоб максимально убрать все лишнее) проблема в том что на карте SD не создается файл (в зависимости от того куда в условном операторе if,else вставить функцию (save()) ) пример такой 

#include <SPI.h>
#include <SD.h>
byte menu = 1;
byte menu1 = 2;
void setup() {
  SD.begin(10);
}
void loop() {
  ret();
}
void save() {
  if (SD.begin(10)) {
    File dataFile = SD.open("date.csv", FILE_WRITE);
    dataFile.print(345);
    dataFile.close();
  }
}
void ret() {
  if (menu == 1) {
    if (menu1 == 0) {
    }
    else if (menu1 == 2) {
      save();
    }
  }
}

вот такой скетч не создает файл, а если функцию (save()) переместить так 


#include <SPI.h>
#include <SD.h>
byte menu = 1;
byte menu1 = 2;
void setup() {
  SD.begin(10);
}
void loop() {
  ret();
}
void save() {
  if (SD.begin(10)) {
    File dataFile = SD.open("date.csv", FILE_WRITE);
    dataFile.print(345);
    dataFile.close();
  }
}
void ret() {
  if (menu == 1) {
    save();
    if (menu1 == 0) {
    }
    else if (menu1 == 2) {
    }
  }
}

то файл создается и в него записываются данные, или в loop положить, то тоже работает. Библиотека стандартная, ничего не трогал. ОЗУ чистил за собой (места должно хватать). Какие есть особенности? Где почитать про это? Спасибо!

Yurchik26
Offline
Зарегистрирован: 16.03.2013

И еще забыл указать, что если выполнить такой скетч 

#include <SPI.h>
#include <SD.h>
byte menu = 1;
byte menu1 = 2;
void setup() {
  SD.begin(10);
}
void loop() {
  ret();
}
void save() {
  if (SD.begin(10)) {
    File dataFile = SD.open("date.csv", FILE_WRITE);
    dataFile.print(345);
    dataFile.close();
  }
}
void ret() {
  if (menu == 1) {
    save();
    if (menu1 == 0) {
    }
    else if (menu1 == 2) {
      save();
    }
  }
}

то файл создается, и в нем прописывается два раза число 345, то есть в первом варианте (где файл не создается) функция выполняется, но не может создать файл, а если файл уже создан, то функция успешно его открывает и пишет число 345.

* Функция ret() выполняется один раз, она не в loop, а в setup.

Yurchik26
Offline
Зарегистрирован: 16.03.2013

Все было как обычно. Проблема в своей невнимательности. Зато несколько дней потрачены на саморазвитие. В моём полном скетче использую библиотеку UTFT. Эту библиотеку я полностью исправлял, убирал все лишнее (чтоб меньше весила). Сделал свой вывод чисел float, вот вырезка с нее

void UTFT::printFLOAT(float val2, int x, int y, int deg)
{
	byte hun=0;
	byte ten=0;
        byte one=0;
	char st[5];
	int num = val2*10;

	hun=num/100;    
	ten=(num-hun*100)/10; 
	one=num-hun*100-ten*10; 
		st[0]=48+hun;
		if (hun==0){
			st[0]=32;
		}		
		st[1]=48+ten;
		st[2]=44;
		st[3]=48+one;
		st[4]=0;
		
	print(st,x,y,deg);
}

Проблема была в том, что когда я объявлял массив (st), я указал размер 4 байта, а по факту писал 5 байт. Компилятор ошибку не выдавал, а я и не думал. Просто невнимательность. 

b707
Offline
Зарегистрирован: 26.05.2017

причем тут библиотека SD и создание файла?

Скорее это яркий пример того. что ВСЕГДА надо выкладывать скетчи полностью, даж когда он "очень большой" и "не имеет отношения к проблеме"...