Usb 使用f_mount将数据读写到文本文件

Usb 使用f_mount将数据读写到文本文件,usb,stm32,file-handling,mmc,fatfs,Usb,Stm32,File Handling,Mmc,Fatfs,在我的应用程序中,我需要使用f_open、f_read&f_write调用来打开、读取和写入文本文件中的数据 无法打开.txt文件 res = f_open(&f_header.file, file_path, FA_OPEN_EXISTING | FA_WRITE | FA__WRITTEN | FA_READ | FA_CREATE_NEW ); printf("res value after f open %d \n\r",res); if (re

在我的应用程序中,我需要使用f_open、f_read&f_write调用来打开、读取和写入文本文件中的数据

无法打开.txt文件

res = f_open(&f_header.file, file_path, FA_OPEN_EXISTING | FA_WRITE | FA__WRITTEN | FA_READ | FA_CREATE_NEW  );
                printf("res value after f open %d \n\r",res);
if (res != FR_OK) {
                printf("Failed to open %s, error %d\n\r", file_path, res);
    }
这是一个错误:

FR\u未启用,/*(12)卷没有工作区*/

为了解决此错误,应用程序需要在每次介质更改后执行f_装载功能,以强制清除文件系统对象

如何在此应用程序中使用f_mount()调用来解决此问题? 我不清楚第二个参数

我添加了这个f_挂载(&fs0,“0://”,1);以解决此问题。

在f_开放电话之前。它也不接受f_mount()调用

res=f_mount(&fs0,"0://", 1);

res = f_open(&f_header.file, file_path, FA_OPEN_EXISTING | FA_WRITE | FA__WRITTEN | FA_READ | FA_CREATE_NEW  );
->代码在f_mount()之前的运行时停止*

下面是我正在使用的f_mount的源代码:

FRESULT f_mount (
    FATFS* fs,          /* Pointer to the file system object (NULL:unmount)*/
    const TCHAR* path,  /* Logical drive number to be mounted/unmounted */
    BYTE opt            /* 0:Do not mount (delayed mount), 1:Mount immediately */
)
{
    FATFS *cfs;
    int vol;
    FRESULT res;
    const TCHAR *rp = path;
    vol = get_ldnumber(&rp);
    if (vol < 0) return FR_INVALID_DRIVE;
    cfs = FatFs[vol];                   /* Pointer to fs object */
    if (cfs) {
#if _FS_LOCK
        clear_lock(cfs);
#endif
#if _FS_REENTRANT                       /* Discard sync object of the current volume */
        if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR;
#endif
        cfs->fs_type = 0;               /* Clear old fs object */
    }
    if (fs) {
        fs->fs_type = 0;                /* Clear new fs object */
#if _FS_REENTRANT                       /* Create sync object for the new volume */
        if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR;
#endif
    }
    FatFs[vol] = fs;            /* Register new fs object */
    if (!fs || opt != 1) return FR_OK;  /* Do not mount now, it will be mounted later */
    res = find_volume(&fs, &path, 0);   /* Force mounted the volume */
    LEAVE_FF(fs, res);
}
FRESULT f_安装(
FATFS*fs,/*指向文件系统对象的指针(NULL:卸载)*/
常量TCHAR*路径,/*要安装/卸载的逻辑驱动器号*/
字节opt/*0:不装载(延迟装载),1:立即装载*/
)
{
特别组织*cfs;
国际卷;
弗雷索尔;
常数TCHAR*rp=路径;
vol=获取\u ldnumber(&rp);
如果(vol<0)返回FR\u无效驱动器;
cfs=FatFs[vol];/*指向fs对象的指针*/
if(cfs){
#如果FS_LOCK
清除锁定(cfs);
#恩迪夫
#如果_FS_可重入/*放弃当前卷的同步对象*/
如果(!ff_del_syncobj(cfs->sobj))返回FR_INT_ERR;
#恩迪夫
cfs->fs_type=0;/*清除旧的fs对象*/
}
if(fs){
fs->fs_type=0;/*清除新的fs对象*/
#如果_FS_REENTRANT/*为新卷创建同步对象*/
如果(!ff_cre_syncobj((字节)vol,&fs->sobj))返回FR\u INT\u ERR;
#恩迪夫
}
FatFs[vol]=fs;/*注册新的fs对象*/
如果(!fs | | opt!=1)返回FR|u OK;/*现在不装载,则稍后将装载它*/
res=find_卷(&fs,&path,0);/*强制装入卷*/
休假(财政司司长、秘书长);
}
  • 代码在生成文件时未显示任何错误/警告。 我确信代码没有问题
  • 代码没有问题。 这是否与emmc中的内存分配或内存不足有关。这种行为的可能原因是什么?我们非常感谢您的帮助
提前感谢和问候

根据:

换句话说,第二个参数是您希望在以后使用该文件系统时如何引用它

例如,像这样安装:

f_mount(&fs0, "0://", 1);
然后,您将能够打开如下文件:

f_open(fp, "0://path/to/file", FA_CREATE_ALWAYS);

我正在将这些文件存储在mmc上。我需要给出哪条路径作为第二个参数?第二个参数的含义是什么?没关系。例如,将其设置为
0://
。这是您选择的逻辑驱动器号。它与Windows中的
C://
D://
驱动器号相同,您也可以自由重命名。我尝试了您建议的解决方案。它不接电话。你说“它不接电话”是什么意思?我建议你仔细检查一下FatFS代码,看看到底出了什么问题。里面有一些注释进一步澄清了设置某些错误时可能出现的错误。对
f_mount
的调用看起来是正确的。您确定您的磁盘I/O实现实际上工作正常吗?我个人建议通读文档()。它描述了我们在这里讨论的所有内容,包括示例和解释在某些情况下某些错误代码的含义。
f_open(fp, "0://path/to/file", FA_CREATE_ALWAYS);