本帖最后由 y909334873 于 2016-9-5 11:03 编辑
刚开始学习文件系统,给单片机移植了fat文件系统,出现了这样一个问题,我创建了一个文本文件(比如说是y.txt),然后给这个文本文件写入一段文本,通过电脑查看SD卡里的内容,显示这个文本文件(y.txt)显示还是0字节;
同时连接是会出现修复U盘的提示。也就是说往文本文件里写数据没有成功。
但是如果我通过电脑给这个文本文件写一句话,保存后是这样的
接下来我在通过单片机给这个文件进行写数据,那么我写的数据量不能超过这个文本文件的13字节,不超过的部分,可以通过电脑正常显示,也可以通过单片机读文件操作。超过的部分通过电脑查看,或者单片机读文件操作读是不成功看不到的
此帖出自
小平头技术问答
- void Test_f_write(void)//写数据到文件,如果没有此文件则创建文件
- {
- FATFS fs; // Work area (file system object) for logical drive
- FRESULT res; // FatFs function common result code
- FIL Make_file;
- char file_name[20]="jj.txt";
- char Storage_buffer[] ="1234567890";
- UINT bw;
- //检测磁盘是否插好
- if( disk_detect_OK()==FALSE ) return;
- logout("
inaert_ok:>");
- // Register a work area for logical drive 0
- f_mount(0, &fs);
- logout("
Make file Name:>");
- // USART_Scanf_Name(file_name);//通过串口输入源文件路径名/dir/file.txt或者0:dir/file.txt或者0:/dir/file.txt
- res = f_open(&Make_file, file_name, FA_OPEN_ALWAYS | FA_WRITE); //可写方式打开 没有文件则创建
- logout("
open_ok:>");
- die(res);
- res = f_lseek(&Make_file, bsize); //指针移到文件最后
- logout("
seek_ok:>");
- die(res);
- res = f_write(&Make_file, Storage_buffer, (sizeof (Storage_buffer))-1 , &bw); //每次需要写入的数据字节数,去掉最后的 所以-1
- logout("
write_ok:>");
- die(res);
- //logout("文件大小=%d字节
",Make_file.fsize);
- res = f_lseek(&Make_file, Make_file.fsize); //指针移到文件最后
- //logout("文件大小=%d字节
",Make_file.fsize);
- f_close(&Make_file);//关闭文件
- logout("
close_ok:>");
- //logout("文件大小=%d字节
",Make_file.fsize);
- logout("
写文件测试OK!
");
- // Unregister a work area before discard it
- f_mount(0, NULL);
- }
- //其中调用的f_wriite函数如下
- FRESULT f_write (
- FIL *fp, /* Pointer to the file object */
- const void *buff, /* Pointer to the data to be written */
- UINT btw, /* Number of bytes to write */
- UINT *bw /* Pointer to number of bytes written */
- )
- {
- FRESULT res;
- DWORD clst, sect;
- UINT wcnt, cc;
- const BYTE *wbuff = buff;
-
- BYTE csect;
- bsize+=btw;
- *bw = 0; /* Initialize byte counter */
- logout("1111111111111111111
");
- res = validate(fp->fs, fp->id); /* Check validity */
- fp->fsize =fp->fsize +btw;
- logout("wenjian=%d
",fp->fsize);
- //f_sync (fp);
- if (res != FR_OK) LEAVE_FF(fp->fs, res);
- if (fp->flag & FA__ERROR) /* Aborted file? */
- LEAVE_FF(fp->fs, FR_INT_ERR);
- logout("22222222222222222222222222
");
- if (!(fp->flag & FA_WRITE)) /* Check access mode */
- LEAVE_FF(fp->fs, FR_DENIED);
- if ((DWORD)(fp->fsize + btw) < fp->fsize) btw = 0; /* File size cannot reach 4GB */
- logout("333333333333333333333333
");
- for ( ; btw; /* Repeat until all data written */
- wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) {
- logout("44444444444444444
");
- if ((fp->fptr % SS(fp->fs)) == 0)
- { /* On the sector boundary? */
-
- csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */
- if (!csect)
- {
- /* On the cluster boundary? */
- if (fp->fptr == 0) { /* On the top of the file? */
- clst = fp->sclust; /* Follow from the origin */
- if (clst == 0) /* When no cluster is allocated, */
- fp->sclust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */
- } else { /* Middle or end of the file */
- #if _USE_FASTSEEK
- if (fp->cltbl)
- clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */
- else
- #endif
-
- clst = create_chain(fp->fs, fp->clust); /* Follow or stretch cluster chain on the FAT */
- }
- if (clst == 0) break; /* Could not allocate a new cluster (disk full) */
- if (clst == 1) ABORT(fp->fs, FR_INT_ERR);
-
- if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR);
- fp->clust = clst; /* Update current cluster */
- //fp->pad1 = 0;
- }
-
- #if _FS_TINY
- if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write-back sector cache */
- ABORT(fp->fs, FR_DISK_ERR);
- #else
- if (fp->flag & FA__DIRTY) { /* Write-back sector cache */
- if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK)
- ABORT(fp->fs, FR_DISK_ERR);
- fp->flag &= ~FA__DIRTY;
- }
- #endif
- sect = clust2sect(fp->fs, fp->clust); /* Get current sector */
- if (!sect) ABORT(fp->fs, FR_INT_ERR);
- sect += csect;
- cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */
- if (cc) { /* Write maximum contiguous sectors directly */
- if (csect + cc > fp->fs->csize) /* Clip at cluster boundary */
- cc = fp->fs->csize - csect;
- if (disk_write(fp->fs->drv, wbuff, sect, (BYTE)cc) != RES_OK)
- ABORT(fp->fs, FR_DISK_ERR);
- #if _FS_TINY
- if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */
- mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs));
- //logout("tiny");
- fp->fs->wflag = 0;
- }
- #else
- if (fp->dsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */
- mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs));
- //logout("no tiny");
- fp->flag &= ~FA__DIRTY;
- }
- #endif
- wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */
- continue;
- }
- #if _FS_TINY
- if (fp->fptr >= fp->fsize) { /* Avoid silly cache filling at growing edge */
- if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR);
- fp->fs->winsect = sect;
- }
- #else
- if (fp->dsect != sect) { /* Fill sector cache with file data */
- if (fp->fptr < fp->fsize &&
- disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK)
- ABORT(fp->fs, FR_DISK_ERR);
- }
- #endif
- fp->dsect = sect;
- }
- logout("555555555555555555
");
- wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs));/* Put partial sector into file I/O buffer */
- if (wcnt > btw) wcnt = btw;
- #if _FS_TINY
- if (move_window(fp->fs, fp->dsect)) /* Move sector window */
- ABORT(fp->fs, FR_DISK_ERR);
- mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */
- fp->fs->wflag = 1;
- #else
- mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */
- fp->flag |= FA__DIRTY;
- #endif
- }
- if (fp->fptr > fp->fsize)
- fp->fsize = fp->fptr; /* Update file size if needed */
- fp->flag |= FA__WRITTEN; /* Set file change flag */
- LEAVE_FF(fp->fs, FR_OK);
- }
- //感觉涉及的函数有点多,不知道该贴些啥。。。
复制代码一周热门 更多>