Библиотека SD.h
- Войдите на сайт для отправки комментариев
Пнд, 21/02/2022 - 23:43
Всем добрый день. Столкнулся с интересной особенностью, хотелось бы понять в чем дело. Есть мой большой скетч (его не прикладываю т.к. он очень большой, сделал вырезку из него чтоб максимально убрать все лишнее) проблема в том что на карте 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 положить, то тоже работает. Библиотека стандартная, ничего не трогал. ОЗУ чистил за собой (места должно хватать). Какие есть особенности? Где почитать про это? Спасибо!
И еще забыл указать, что если выполнить такой скетч
#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.
Все было как обычно. Проблема в своей невнимательности. Зато несколько дней потрачены на саморазвитие. В моём полном скетче использую библиотеку 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 байт. Компилятор ошибку не выдавал, а я и не думал. Просто невнимательность.
причем тут библиотека SD и создание файла?
Скорее это яркий пример того. что ВСЕГДА надо выкладывать скетчи полностью, даж когда он "очень большой" и "не имеет отношения к проблеме"...