grayloach 发表于 2019-9-23 12:38:46

FatFS文件系统写入的文件在PC上看不到内容

源码是从官网直接下载下来的,版本为R0.33
/*----------------------------------------------------------------------------/
/FatFs - Generic FAT Filesystem ModuleR0.13c                              /
/-----------------------------------------------------------------------------/
文件可以读写,也可以创建文件,但是在写文件时有一个奇怪的现象:通过PC文件浏览器显示文件大小为0,具体表现如下:
1、写入的内容使用DiskGenius可以查看到内容。
2、写入完成后使用该文件系统读取文件长度为0.
3、使用DiskGenius查看文件的目录,发现0x1C开始的值没有变(为0)。
4、如果使用PC将文件写入内容,比如100字节,那么使用单片机不管写入多少在PC上都只能看到100字节,而使用DiskGenius、Winhex可以看到单片机写入的所有内容,只是文件目录项的“文件长度”依旧为100.

之前测试FatFs的“阉割版”Petit FatFs时发现这个问题,以为FatFs没有这个问题了。
不知道其他朋友有没有遇到这个问题,一开始我以为是没有调用f_sync()同步文件内容,可是写入完成后我调用了f_sync()函数在f_close()也不起作用。

从WinHex的显示来看,单片机没有给WRITE.TXT分配起始簇,真是神奇了!




BG4RFF 发表于 2019-9-23 13:43:29

我用103VE挂载fatfs可以的啊,不过单片机读写完就释放,挂载USB的时候单片机就不读写

grayloach 发表于 2019-9-24 12:48:58

BG4RFF 发表于 2019-9-23 13:43
我用103VE挂载fatfs可以的啊,不过单片机读写完就释放,挂载USB的时候单片机就不读写 ...

你是用的模拟SPI么?我看网上都是用的SDIO,但是从原理上来说应该都一样的。我用FatFS官网下载的demo和Cube生成的代码都测试了,全部都是一个现象:可以读、可以创建文件,但是就是不能正常写入文件,写操作完成后程序也能反馈FR_OK,但是在此读取的时候返回FR_DISK_ERR。

int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_USART1_UART_Init();
MX_FATFS_Init();
/* USER CODE BEGIN 2 */
FATFS fs;
FIL file;
FIL *fp = &file;
UINT br;
FRESULT res = FR_OK;
BYTE buffer;

printf("Initialize SD Card !\r\n");

res = f_mount(&fs, "0:\\", 1);
printf("f_mount(), res = %d\r\n", res);

if(FR_OK == res)
{
res = f_open(fp, "0:\\MESSAGE.TXT", FA_OPEN_EXISTING/*FA_OPEN_ALWAYS*/ | FA_READ);
printf("f_open(), res = %d\r\n", res);

if(FR_OK != res)
{
   while(1);
}
}

if(FR_OK == res)
{
br = 0;
res = f_lseek(fp, 0);
printf("f_lseek(), res = %d\r\n", res);

res = f_read(fp, buffer, sizeof(buffer) - 1, &br);
printf("f_read(), res = %d, br = %d\r\n", res, br);
if(FR_OK != res && br < 1)
{
   while(1);
}
else
{
   int i = 0;
   while(i < br)
   {
    putchar(buffer);
    i ++;
   }
}
}

res = f_close(fp);
printf("f_close(), res = %d\r\n", res);

res = f_open(fp, "0:\\TEST.TXT", /*FA_CREATE_NEW |*/ FA_WRITE);
printf("f_open(), res = %d\r\n", res);

if(FR_OK == res)
{
UINT bw = 0;
res = f_lseek(fp, f_size(fp));
printf("f_lseek(), res = %d\r\n", res);

res = f_write(fp, "Hello world !\r\n", sizeof("Hello world !\r\n"), &bw);
printf("f_write(), res = %d, bw = %d\r\n", res, bw);
}

f_sync(fp);

f_close(fp);

res = f_open(fp, "0:\\TEST.TXT", FA_OPEN_EXISTING | FA_READ);
printf("f_open(), res = %d\r\n", res);

res = f_lseek(fp, 0);
printf("f_lseek(), res = %d\r\n", res);

res = f_read(fp, buffer, sizeof(buffer) - 1, &br);
printf("f_read(), res = %d, br = %d\r\n", res, br);
if(FR_OK != res && br < 1)
{
// while(1);
}
else
{
int i = 0;
while(i < br)
{
   putchar(buffer);
   i ++;
}
}
f_close(fp);


f_mount(&fs, "0:\\", 0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
页: [1]
查看完整版本: FatFS文件系统写入的文件在PC上看不到内容