你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
灰泥鳅 提问时间:2019-9-23 12:38 /
源码是从官网直接下载下来的,版本为R0.33
/*----------------------------------------------------------------------------/
/  FatFs - Generic FAT Filesystem Module  R0.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分配起始簇,真是神奇了!


WinHex读取

WinHex读取

PC文件浏览器

PC文件浏览器


收藏 评论2 发布时间:2019-9-23 12:38

举报

2个回答
BG4RFF 回答时间:2019-9-23 13:43:29
我用103VE挂载fatfs可以的啊,不过单片机读写完就释放,挂载USB的时候单片机就不读写
灰泥鳅 回答时间: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[200];

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 */
}

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版