首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FatFS f_write不工作

FatFS f_write不工作
EN

Stack Overflow用户
提问于 2016-03-26 21:30:15
回答 6查看 12.4K关注 0票数 2

我在一个ZedBoard和我试图写在SD卡。我的工作是一个嵌入式系统,我没有任何操作系统,我正在运行裸金属。

我可以从SD卡上读得很好,他们没问题。

但当我试着阅读的时候,我有一些奇怪的行为:

  • f_write返回FR_OK
  • bw (写的字节)变量是正确的。
  • 文件是创建的(当我从我的电脑读取SD卡时,我可以看到它)。

但是当我读到文件时,它是空的。

这是我的代码:

代码语言:javascript
复制
void WriteFile(char const* fileName, char* buffer, size_t size)
{
    FIL file;
    FATFS fs;
    UINT bw;
    FRESULT fr;

    f_mount(&fs, "", 0);
    f_open(&file, fileName, FA_WRITE | FA_CREATE_ALWAYS);
    fr = f_write(&file, buffer, size, &bw);
    if (size != bw || fr != FR_OK)
        PRINT(("Error in writing !\n"));
    f_close(&file);
    f_mount(NULL, "", 0);
}

我称之为这样的方法:

代码语言:javascript
复制
 WriteFile("Hello.txt", "Hello World !", 13);

知道我做错了什么吗?

EN

回答 6

Stack Overflow用户

发布于 2016-06-01 12:11:09

您只需刷新缓冲区(f_sync):

代码语言:javascript
复制
        FRESULT result;
        FATFS fs;
        FIL file;

        const char string[] = "Hallo world\0";
        uint16_t written = 0;
        FILINFO fno;

        /* Open or create a log file and ready to append */
        printf("mount:%d",f_mount(&fs, "", 1));
        printf("open: %d", f_open(&file, "log.txt", FA_WRITE  | FA_OPEN_ALWAYS ));
        printf("stat: %d", f_stat("log3.txt", &fno));
        printf("write: %d wr: %d", f_write(&file, string, 11, &written), written);
        printf("flush: %d", f_sync(&file));
        printf("close: %d", f_close(&file)); /* close performs sync before close */
票数 3
EN

Stack Overflow用户

发布于 2016-05-08 21:13:26

我发现一个小黑客回答了我的问题:

基本上,它不会写在SD卡上,因为缓冲区还没有满(在XILINX的低级API中)。

所以我所做的非常简单:我只写了一次数据。虽然文件的大小并不等于或大于写入的数据大小,但我写0(按块32)。

另外,另一件重要的事情是:您编写的数据必须是对齐的32个字节!\这里是我的(工作)代码:

代码语言:javascript
复制
size_t SizeOfFile(char const *path)
{
    FILE *fp = fopen(path, "r");
    fseek(fp, 0, SEEK_END);
    size_t fsize = (size_t) ftell(fp);
    fclose(fp);
    return fsize;
}

void WriteFile( char const* fileName, char* buffer, size_t size )
{
    size_t allignement = ( size + 32 - 1 ) & ~ ( 32 - 1 );  // We must allign by 32
    char* Buffer_logger = pleb_malloc( allignement );
    pleb_memset( Buffer_logger, 0, allignement );
    pleb_memcpy( Buffer_logger, buffer, size );

    unsigned int BytesWr;
    size_t accum = 0;
    result = f_open( &file, fileName, FA_CREATE_ALWAYS | FA_WRITE | FA_READ );
    if ( result != 0 )
    {
        return;
    }

    sprintf( Buffer_logger, "%s", buffer );

    while ( SizeOfFile( fileName ) == 0 )
    {
        // Open log for writing
        result = f_open( &file, fileName, FA_WRITE );
        if ( result != 0 )
        {
            return;
        }

        // Point to the EOF
        result = f_lseek( &file, accum );
        if ( result != 0 )
        {
            return;
        }

        // Write to log
        result = f_write( &file, (const void*) Buffer_logger, size, &BytesWr );
        if ( result != 0 )
        {
            return;
        }

        accum += accum + strlen( Buffer_logger );

        //Close file.
        result = f_close( &file );
        if ( result != 0 )
        {
            return;
        }

        pleb_memset( Buffer_logger, 0, allignement );

        size = 32;
        pleb_memset( Buffer_logger, 0, size );
    }
    pleb_free( Buffer_logger );
    PRINT( ("Data written to log Successfully\r\n") );
}
票数 2
EN

Stack Overflow用户

发布于 2017-04-21 12:20:38

我在使用Xilinx SoC编写SD时遇到了同样的问题,比如ZedBoard。我无法在SD卡上写入数据,即使:

  • 所有功能都成功了。
  • 我能够删除和创建文件(所以我不是只读的)。
  • 当我读回我在卡片上写的东西(用f_lseek返回到0和f_read)时,我读取了正确的数据。

每次我在重新启动后读取文件时,它都是空的。

我试过以前的解决方案,但都没有用。史蒂夫的回答使我走上了正确的轨道。

修复:我需要用256个字节的块编写数据才能将数据实际写入SD。256个字节是SD卡中页面大小的大小,所以这很有意义。

如果写入值不是256的倍数,则不会写入所有数据。例如:

使用f_write -> Bytes编写的字节实际上被写入文件

512 -> 512

480 -> 256

255 -> 0

256 -> 256

希望它能帮助到某人:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36241121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档