串口打印内容:
时间变化,关闭当前文件
[08:55:25.207]收←◆新建HEX数据文件:0:/Board4/20250701110000.hex 无法创建数据文件: 0:/Board4/20250701110000.hex,错误: 16 无法创建数据文件!
Code:
FIL* FATFS_CreateRawDataFileWithTimestamp(void)
{
static FIL file;
FRESULT res;
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
//确保缓冲区足够大
static char filename[64];
// 获取当前时间
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
// // 检查是否需要创建新文件(年份、月份、日期或小时任一变化)
// bool needNewFile = (sDate.Year != currentFileYear) ||
// (sDate.Month != currentFileMonth) ||
// (sDate.Date != currentFileDay) ||
// (sTime.Hours != currentFileHour);
// 更新当前文件时间
currentFileYear = sDate.Year;
currentFileMonth = sDate.Month;
currentFileDay = sDate.Date;
currentFileHour = sTime.Hours;
// 构造目录路径
char folder[32];
snprintf(folder, sizeof(folder), "0:/Board%u", g_config.board_id);
// 确保目录存在(每次调用都检查,不再使用静态变量)
res = f_mkdir(folder);
if (res != FR_OK && res != FR_EXIST)
{
printf("无法创建文件夹 %s,错误码: %d\r\n", folder, res);
return NULL;
}
// 生成带完整时间戳的文件名 (格式: YYYYMMDDHHMMSS.hex)
// 修改文件名格式
snprintf(filename, sizeof(filename),
"%s/%04d%02d%02d%02d%02d%02d.hex",
folder,
2000 + sDate.Year, // RTC年份是从2000开始的偏移
sDate.Month,
sDate.Date,
sTime.Hours,
sTime.Minutes,
sTime.Seconds);
// // 尝试打开文件(如果存在则追加)
// res = f_open(&file, filename, FA_OPEN_ALWAYS | FA_WRITE);
// if(res != FR_OK)
// {
// // 直接输出错误代码(方法1)
// printf("无法打开数据文件: %s, 错误: %d\r\n", filename, res);
// // 尝试创建备用文件
// static int backupCount = 0;
// snprintf(filename, sizeof(filename), "%s/backup%d.hex", folder, backupCount++);
// res = f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE);
// if(res != FR_OK)
// {
// printf("创建备用文件失败: %d\r\n", res);
// return NULL;
// }
// else
// {
// printf("创建备用文件: %s\r\n", filename);
// }
// }
// 创建文件
res = f_open(&file, filename, FA_CREATE_ALWAYS | FA_WRITE);
if(res != FR_OK)
{
printf("无法创建数据文件: %s, 错误: %d\r\n", filename, res);
return NULL;
}
// 移动到文件末尾准备追加数据
res = f_lseek(&file, f_size(&file));
if (res != FR_OK)
{
printf("文件定位失败: %d\r\n", res);
f_close(&file);
return NULL;
}
// 打印文件状态
if (f_size(&file) == 0)
{
printf("新建HEX数据文件: %s\r\n", filename);
}
else
{
printf("续写HEX数据文件: %s\r\n", filename);
}
return &file;
}
void CheckAndCreateNewFileIfNeeded(void)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
// 获取当前时间
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
// 检查是否需要创建新文件
if ((currentFileHour != sTime.Hours) || (currentFileDay != sDate.Date))
{
// 关闭当前文件
// f_close(&rawDataFile);
if (fileCreated)
{
f_sync(&rawDataFile);
f_close(&rawDataFile);
fileCreated = false;
}
printf("时间变化,关闭当前文件\r\n");
// 创建新文件
FIL* filePtr = FATFS_CreateRawDataFileWithTimestamp();
if(filePtr == NULL)
{
printf("无法创建新数据文件!\r\n");
Error_Handler();
}
rawDataFile = *filePtr;
currentFileHour = sTime.Hours;// 更新当前文件时间
currentFileDay = sDate.Date;// 更新当前文件时间
}
}
|