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

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

[复制链接]
grayloach 提问时间: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的时候单片机就不读写
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[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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版