не верно работает SD.open

vde69
Offline
Зарегистрирован: 10.01.2016

Довольно простой код, физически нужный каталог и нужный файл на карте создаются, но !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(); }

 

vde69
Offline
Зарегистрирован: 10.01.2016

До этого у меня был код который работал, но в нем были проблемы с памятью (часть работало на String) а вот все переписал на pchar и теперь нет утечки памяти, но не работает :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Что такое у вас _DT ? Что вы делаете действиями в стоках 4...6 ?

 

vde69
Offline
Зарегистрирован: 10.01.2016

brokly пишет:

Что такое у вас _DT ? Что вы делаете действиями в стоках 4...6 ?

Это самописный объект работы с датами, там формируется путь и имя файла с учетом ведущих нулей

в результате получаем такую строку "log/2010/10/term__08.txt" 

Возможно что то с терминатором pchar, сейчас проверю

 
rkit
Offline
Зарегистрирован: 23.11.2016

А что такое pchar, просите?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

rkit пишет:

А что такое pchar, просите?

ASCIIZ строка. Pointer to null-terminated Char. 

vde69
Offline
Зарегистрирован: 10.01.2016

вроде победил, основная причина в том, что базовая библиотека 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 инициируются...

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Объявите их как статик и убедитесь, что использование памяти не изменилось.