не верно работает SD.open
- Войдите на сайт для отправки комментариев
Сб, 09/01/2021 - 14:47
Довольно простой код, физически нужный каталог и нужный файл на карте создаются, но !f_log_term всегда возвращает true, то есть я не понимаю, открыт файл или нет и могу я в него писать или нет.
Удалять в карты пробовал - результат тот же, файл и каталог создаются но в условии f_log_term всегда определяется как false
До этого
char f_name[25] = "log/0000/00/______00.txt";
char d_name[12] = "log/0000/00";
char str[4] = "";
_DT->year_f(str); memcpy (&f_name[4], str, 4);
_DT->month_f(str); memcpy (&f_name[9], str, 2);
_DT->hour_f(str); memcpy (&f_name[18], str, 2);
memcpy (d_name, f_name, 11);
memcpy (&f_name[12], "term__", 6);
Serial.println(f_name);
File f_log_term;
if (active != 0) {
f_log_term = SD.open(f_name, FILE_WRITE);
if (!f_log_term) {
//f_log_term.close();
SD.mkdir(d_name);
f_log_term = SD.open(f_name, FILE_WRITE);
if (!f_log_term) {
Serial.print("MICRO SD: Open file ERROR - ");
Serial.println(f_name);
Serial.println(d_name);
}
}
}
if (f_log_term) { f_log_term.close(); }
До этого у меня был код который работал, но в нем были проблемы с памятью (часть работало на String) а вот все переписал на pchar и теперь нет утечки памяти, но не работает :)
Что такое у вас _DT ? Что вы делаете действиями в стоках 4...6 ?
Что такое у вас _DT ? Что вы делаете действиями в стоках 4...6 ?
Это самописный объект работы с датами, там формируется путь и имя файла с учетом ведущих нулей
в результате получаем такую строку "log/2010/10/term__08.txt"
Возможно что то с терминатором pchar, сейчас проверю
А что такое pchar, просите?
А что такое pchar, просите?
ASCIIZ строка. Pointer to null-terminated Char.
вроде победил, основная причина в том, что базовая библиотека SDFile не сильно рассчитана на одновременную работу с несколькими файлами, да и вообще не сильно она "прямая", поковырял ее и сделал так
void SaveLog(){ #if defined(DEVICE_RTC_I2C_DS1307) RTC_I2C_DS1307* _DT = (RTC_I2C_DS1307*)DT_Obj; #elif defined(DATE_TIME_USE) addon_DateTime* _DT = (addon_DateTime*)DT_Obj; #endif char d_log[30]; char f_name[25] = "LOG/0000/00/______00.TXT "; char d_name[12] = "LOG/0000/00 "; char str[4] = ""; File f_log_term; _DT->year_f(str); memcpy (&f_name[4], str, 4); _DT->month_f(str); memcpy (&f_name[9], str, 2); _DT->day_f(str); memcpy (&f_name[18], str, 2); memcpy (&d_name[0], f_name, 11); d_name[11]=0; #ifdef DEVICE_TEMPERATURE_ONE_WIRE_DS18B20 if (0 < DEVICE_TEMPERATURE_ONE_WIRE_DS18B20) { memcpy (&f_name[12], "TERM__", 6); f_name[24]=0; if (active != 0) { if (!SD.exists(d_name)) { Serial.print("MICRO SD: Create dir - "); Serial.println(d_name); SD.mkdir(d_name); } f_log_term = SD.open(f_name, FILE_WRITE); } for (int num=0; num < DEVICE_TEMPERATURE_ONE_WIRE_DS18B20; num++){ if ( last_term[num] != TT_Obj->term(num) ) { _DT->year_f(str); memcpy (&d_log[0], str, 4); d_log[4]='/'; _DT->month_f(str); memcpy (&d_log[5], str, 2); d_log[7]='/'; _DT->day_f(str); memcpy (&d_log[8], str, 2); d_log[10]='|'; _DT->hour_f(str); memcpy (&d_log[11], str, 2); d_log[13]=':'; _DT->minute_f(str); memcpy (&d_log[14], str, 2); d_log[16]=':'; _DT->second_f(str); memcpy (&d_log[17], str, 2); d_log[19]='|'; d_log[20] = uint8_t((num / 10)+48); d_log[21] = uint8_t((num % 10)+48); d_log[22]='|'; d_log[23] = uint8_t((TT_Obj->term(num) / 100)+48); d_log[24] = uint8_t((uint8_t(TT_Obj->term(num) / 10) % 10)+48); d_log[25] = uint8_t((TT_Obj->term(num) % 10)+48); d_log[26]=0; Out(d_log, &f_log_term); last_term[num] = TT_Obj->term(num); } } } #endif f_log_term.close(); }надо будет потом формирование строки для лога поаккуратнее сделать, но в целом сейчас все работает,
и еще мне не нравится как массивы char инициируются...
Объявите их как статик и убедитесь, что использование памяти не изменилось.