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

FileX 使用exFAT无法获取到正常的文件名unicode_name

[复制链接]
我在哪? 提问时间:2026-5-14 00:21 / 未解决

ThreadX下使用的FileX,版本为6.4.0,使用STM32H563,SDK版本:STM32Cube FW_H5 V1.6.0

使用fx_directory_next_entry_find(&sdio_disk , file_name)遍历文件夹下的条目,我使用16GB FAT32的SD卡可以获取到中文文件名的短名(UTF-16LE编码),使用fx_unicode_name_get(&sdio_disk,file_name,unicode_name,&unicode_name_length)可以获取到长文件名(UTF-16LE编码)。但当我使用400GB的exFAT的SD卡时fx_directory_next_entry_find获取到的中文文件名异常,fx_unicode_name_get获取不到长文件名;UTF-16LE编码的文件名{0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x66,0x00,0x6c,0x00,0x61,0x00,0x63,0x00}使用fx_directory_next_entry_find获取到的文件名为{0xF7,0xFE,0xB1,0x00}

使用的函数内容

/* 搜索音频文件 */
uint32_t music_file_search(char* file_directory, char *file_list)
{
    CHAR file_name[FX_MAX_LONG_NAME_LEN];
    UCHAR unicode_name[FX_MAX_LONG_NAME_LEN]; // 原始UTF-16
    ULONG unicode_name_length;
    CHAR long_name[50];

    uint16_t file_count = 0;
    uint8_t status;

    status = fx_directory_default_set(&sdio_disk,file_directory);
    // status = fx_directory_local_path_set(&sdio_disk, file_directory, file_directory);
    if (status != FX_SUCCESS) {
        printf("fx_directory_default_set fail:0x%x\r\n", status);
        return 0;
    }

    while (1) {
        printf("-------------------------------------------------------------\r\n");

        status = fx_directory_next_entry_find(&sdio_disk , file_name);
        if (status == FX_NO_MORE_ENTRIES){//文件夹遍历完毕退出
            // printf("Found %d files and saved them to the list.\r\n", file_count);
            printf("folder traversal completed,found %d files.\r\n", file_count);
            break;
        }
        if (status != FX_SUCCESS) {
            printf("fx_directory_next_entry fail:0x%x\r\n", status);
            break;
        }

        //检查条目是不是目录  是目录就跳过下面内容开始新循环
        status = fx_directory_name_test(&sdio_disk, file_name);
        if (status == FX_SUCCESS) continue;

        status = fx_directory_long_name_get(&sdio_disk,file_name,long_name);
        // status = fx_directory_long_name_get(&sdio_disk, file_name, unicode_name);
        if (status == FX_SUCCESS)
        {
            printf("fx_directory_long_name_get success.\r\n");
            for (uint8_t i=0; i<20; i++) {
                printf("0x%x,",long_name[i]);
                long_name[i] = 0;
            }
            printf("\r\n");
        }
        else {
            printf("fx_directory_long_name_get fail:0x%x\r\n", status);
        }

        // status = fx_unicode_short_name_get()
        status = fx_unicode_name_get(&sdio_disk,file_name,unicode_name,&unicode_name_length);
        if (status == FX_SUCCESS)
        {
            printf("unicode_name:%s, len:%ld\r\n",unicode_name,unicode_name_length);
            for (uint16_t i=0; i<unicode_name_length*2; i++) {
                // if((unicode_name[i] == 0) && (unicode_name[i+1] == 0)) break;
                printf("0x%.2x,",unicode_name[i]);
                unicode_name[i] = 0;
            }
            printf("\r\n");
        }
        else{
            printf("fx_unicode_name_get fail:0x%x\r\n", status);
        }

        printf("file name:%s\r\n", file_name);
        for (uint16_t t=0; t<14; t++) {
            printf("0x%.2x,",file_name[t]);
            file_name[t] = 0;
        }
        printf("\r\n");

        file_count++;
    }

    status = fx_directory_default_set(&sdio_disk,file_directory);
    if (status != FX_SUCCESS) {
        printf("fx_directory_local_path_clear fail:0x%x\r\n", status);
    }

    return file_count;
}

16GB SD卡 FAT32 串口打印的信息

App_ThreadX_ start.
tx_event_flags_create success.
fx_media_open success.
-------------------------------------------------------------
-------------------------------------------------------------
fx_unicode_name_get fail:0x4
file name:test.txt
-------------------------------------------------------------
-------------------------------------------------------------
unicode_name:������, len:9
0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x66,0x00,0x6c,0x00,0x61,0x00,0x63,0x00,
file name:������~1.FLA
-------------------------------------------------------------
unicode_name:������, len:8
0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x74,0x00,0x78,0x00,0x74,0x00,
file name:��������.TXT
-------------------------------------------------------------
unicode_name:1, len:12
0x31,0x00,0x31,0x00,0x32,0x00,0x2d,0x00,0xf7,0x8f,0xfe,0x96,0xb1,0x82,0x00,0x5f,0x2e,0x00,0x74,0x00,0x78,0x00,0x74,0x00,
file name:112-��~1.TXT
-------------------------------------------------------------
fx_unicode_name_get fail:0x4
file name:ABCD1234567890.txt
-------------------------------------------------------------
folder traversal completed,found 5 files.

400GB SD卡 exFAT 串口打印的信息

App_ThreadX_ start.
tx_event_flags_create success.
fx_media_open success.
-------------------------------------------------------------
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:���
-------------------------------------------------------------
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:ABCD1234567890.txt
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:test.txt
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:112-���
-------------------------------------------------------------
fx_unicode_name_get fail:0x22
file name:���
-------------------------------------------------------------
folder traversal completed,found 5 files.
收藏 评论0 发布时间:2026-5-14 00:21

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版