1

不明な数のファイルの中から最新のファイルを見つけるために、C と FATFS を使用して STM32 MCU 用のプログラムを作成する必要があります。ファイル名には作成日が含まれており、ファイル名の数字は「_」で区切られています。例: oil_sensor_22_07_20_13_15.csv

ファイルから日付と時刻を抽出し、それらの時差を計算するコードを作成しました。しかし、すべてのファイルの中から最新のファイルを見つける方法がわかりません。

2 つのファイル間の時間差を計算するコードと、2 つのファイルから最新のファイルを見つけるコードを含めます。

2 つのファイル名の時間差を計算する関数:

double calc_passed_secs(char * name_str_01, char * name_str_02 ){

struct tm tm_struct_1,tm_struct_2;
time_t time_t_1,time_t_2;


// Returns first token
char* token = strtok(name_str_01, "_");

token = strtok(NULL, "_");

token = strtok(NULL, "_");
tm_struct_1.tm_mday = atoi(token);

token = strtok(NULL, "_");
tm_struct_1.tm_mon = atoi(token);

token = strtok(NULL, "_");
tm_struct_1.tm_year = atoi(token);

token = strtok(NULL, "_");
tm_struct_1.tm_hour = atoi(token);

token = strtok(NULL, "_");
token = strtok(token, ".");
tm_struct_1.tm_min = atoi(token);

tm_struct_1.tm_sec = 0;

// Returns first token
token = strtok(name_str_02, "_");

token = strtok(NULL, "_");

token = strtok(NULL, "_");
tm_struct_2.tm_mday = atoi(token);

token = strtok(NULL, "_");
tm_struct_2.tm_mon = atoi(token);

token = strtok(NULL, "_");
tm_struct_2.tm_year = atoi(token);

token = strtok(NULL, "_");
tm_struct_2.tm_hour = atoi(token);

token = strtok(NULL, "_");
token = strtok(token, ".");
tm_struct_2.tm_min = atoi(token);

tm_struct_2.tm_sec = 0;

double seconds = difftime(mktime(&tm_struct_1),mktime(&tm_struct_2));

printf("\r\nTime difference in seconds: %.f\r\n",seconds);

return seconds;

}

そして、最新のファイルを見つけるためのプログラム(プログラムは望ましい結果を与えません)。

  char newest_log_file[128];
  char oldest_log_file[128];


  char first_log_file [128];
  char second_log_file [128];

  char first_log_file_cpy [128];
  char second_log_file_cpy [128];


  //char printf_buff [128];

  // find first file
  fr = f_findfirst(&dj, &fno1, "", "oil_sensor_*.csv");

  strcpy( first_log_file,fno1.fname);

  strcpy(first_log_file_cpy, first_log_file);

  if (!fno1.fname[0]) {
      bool make_first_log_file = true;
  }

  if (fno1.fname[0]) {
      fr = f_findnext(&dj, &fno1);
  }

  if (fno1.fname[0]) {
      strcpy(second_log_file,fno1.fname);

      strcpy(second_log_file_cpy, second_log_file);
  }


  printf("\r\nFirst Log File: %s\r\n", first_log_file);

  printf("\r\nSecond Log File: %s\r\n", second_log_file);


  double seconds = calc_passed_secs(first_log_file , second_log_file);

  if (seconds < 0){
    strcpy(newest_log_file, second_log_file_cpy);
  }

  if (seconds > 0) {
    strcpy(newest_log_file, first_log_file_cpy);
  }

  printf("\r\nnewest file: %s\r\n", newest_log_file);

  do {

      f_findnext(&dj,&fno1);

      strcpy(first_log_file, fno1.fname);

      strcpy(first_log_file_cpy, first_log_file);

      f_findnext(&dj,&fno1);

      strcpy(second_log_file,fno1.fname);

      strcpy(second_log_file_cpy, second_log_file);

      printf("\r\nFirst Log File: %s\r\n", first_log_file);

      printf("\r\nSecond Log File: %s\r\n", second_log_file);

      if (seconds < 0){
        strcpy(newest_log_file, second_log_file_cpy);
      }

      if (seconds > 0) {
        strcpy(newest_log_file, first_log_file_cpy);
      }

      printf("\r\nnewest file: %s\r\n", newest_log_file);


      seconds = calc_passed_secs(first_log_file, second_log_file);

} while (fr == FR_OK && fno1.fname[0]);

  f_closedir(&dj);
4

1 に答える 1