собрать имя файла из массива char.

rembo
Offline
Зарегистрирован: 14.11.2012

здравствуйте, возникло затруднение -- есть ds1307, считываю данные в char массив. элементы массива -- день, месяц, год. хочу создать файл с именем файла день_месяц_год. как это сделать? библиотека `sd.h` ругается на то, что имя файла должно быть либо char либо uint8_t. то есть мне надо собрать массив в одну строку?  

maksim
Offline
Зарегистрирован: 12.02.2012

Вам надо показать код и лог ошибки.

leshak
Offline
Зарегистрирован: 29.09.2011

sprintf - C++ Reference

пример

sprintf | Liudr's Blog

 

P.S. Вмысле да, только вам нужно не "собрать строку", а "сформировать строку из числовых данных (конвертировав их в строку)", а поможет вам в этом - ссылки выше

leshak
Offline
Зарегистрирован: 29.09.2011

Вообщем будет что-то типа

char fileName[25];
sprintf(fileName,"%02d-%02d-%02d.log",data[2],data[1],data[0]); // формируем имя файла
SD.open(fileName, FILE_WRITE);

 

rembo
Offline
Зарегистрирован: 14.11.2012


char fnm[30];

den = RTC.get(DS1307_DATE, true);
mes = RTC.get(DS1307_MTH, true);
god = RTC.get(DS1307_YR,true);
chas = RTC.get(DS1307_HR,true);
minuta = RTC.get(DS1307_MIN,true);
secunda = RTC.get(DS1307_SEC,true);

sprintf(fnm, "data/%02d_%02d_%02d_%02d_%02d_%02d.log", den, mes, god, chas, minuta, secunda);

в сериале вижу:

 

data/29_03_2013_09_20_48.log
 
вроде-бы все нормально, но ардуина зависает. стоит только закоментировать sprintf и работает нормально.

 

 

ustas
Offline
Зарегистрирован: 12.03.2012

rembo пишет:

вроде-бы все нормально, но ардуина зависает. стоит только закоментировать sprintf и работает нормально.

У вас, видимо, уже закончилась память. Пробуйте оптимизировать код. Выкидывайте лишние куски, делайте свою реализацию "умных" функций (типа sprintf, и всех других, особенно тех, что работают со строками).

rembo
Offline
Зарегистрирован: 14.11.2012

 

Размер скетча в двоичном коде: 19 886 байт (из 32 256 байт максимум)
 
да и опрос часов идет в самом начале скетча.
ustas
Offline
Зарегистрирован: 12.03.2012

угу.. вспоминаются свои подобные замечания ;) (сейчас придет leshak и на аналогиях в очередной раз расскажет ;))

речь об "оперативной" памяти

rembo
Offline
Зарегистрирован: 14.11.2012

понял о чем вы, попробую оптимизировать.

rembo
Offline
Зарегистрирован: 14.11.2012

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

 

leshak
Offline
Зарегистрирован: 29.09.2011

rembo пишет:

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

 

Прийдется ждать пока прийдет пользовать с ником ВольфМессинг, может он сможет помочь

rembo
Offline
Зарегистрирован: 14.11.2012

#include <Wire.h>
#include <SD.h>
#include <DS1307.h>

int den, mes, god, chas, minuta, secunda;
File myfile;
char fnm[30];

void setup(){
Serial.begin(9600);
den = RTC.get(DS1307_DATE, true);
mes = RTC.get(DS1307_MTH, true);
god = RTC.get(DS1307_YR,true);
chas = RTC.get(DS1307_HR,true);
minuta = RTC.get(DS1307_MIN,true);
secunda = RTC.get(DS1307_SEC,true);

sprintf(fnm, "%02d_%02d_%02d_%02d_%02d_%02d.log", den, mes, god, chas, minuta, secunda);
}

void loop(){
myfile = SD.open(fnm,  FILE_WRITE);
if (myfile){
Serial.print("yes"); 
myfile.close();
} else {
Serial.println("no");
}
}
leshak
Offline
Зарегистрирован: 29.09.2011

Во первых попробуйте руками сдеть 

fnm="29_03_2013_09_20_48.log"

и посмотрите создатся ли, возможно совсем и не в формировании дело, а именно в работе с SD

Во вторых, вы там выше пытались в папку data забандюрить. Не знаю, может уже и умеет SD библиотека работать с папками, но раньше - не умела.

Кстаи то же самое относилось и к именам файлов. Старый добрый 8.3 только разрешался (не более 8-ми букв имя файла, не более 3-х расширение).

Да и в loop() бескоенчное открытие одного и того же файла - както странно (скорее всего не в нем причина, но все же).

rembo
Offline
Зарегистрирован: 14.11.2012

дело в 8 символах. даже в описании к библиотеке стоит такое ограничение.

leshak
Offline
Зарегистрирован: 29.09.2011

Ну значит либо "урезать аппетиты", либо искать либу более продвинутую.

krikus
Offline
Зарегистрирован: 22.07.2011

-->дело в 8 символах. 

Не только. В void setup() - нет функции инита SD карты - "SD.begin(SS_PIN);" Насчет папкок, библиотека умеет их создавать и удалять. Можно по ним сортировку сделать.

dardik
Offline
Зарегистрирован: 09.03.2013

Я поступал иначе.

Формировал строку из значений ДДММГГГГ.log и затем переформировывал все это в массив filename

String filename1 = String(now.date())+String(now.month())+String(now.year())+".log";
char filename[filename1.length()+1];
filename1.toCharArray(filename,sizeof(filename));

 File dataFile = SD.open(filename, FILE_WRITE);