CH376S创建长文件名文件

用CH376S创建长文件名文件时,根据EXAM11例程创建文件,发现返回的数值是0x41,在电脑中查看U盘文件,短文件名文件有创建,长文件名没有创建,还有想知道这个短文件名和长文件名之间有什么对应关系吗,还是随意命名一个短文件名和长文件名都可以,劳烦求教

s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );


创建出来的文件特别大,2.6G,文件名有乱码,想创建"20211009_LonGgFileName.HCD"这个文件名,求解答image.png


您好,报错0x41表示您的短文件名文件已经被打开过,您确认一下这个返回值错误是否为创建文件后出现的。还是后面CH376GetLongName函数返回的错误,创建长文件的完整CH32F103工程,这边已经邮件回复您了,您可以根据工程做代码移植即可。


您好,我根据您发给我的CH32例程移植,发现创建出来的只显示短文件名文件,而且文件大小很大,这是怎么回事


您基于我那个代码移植的话,先不要修改内容,最终效果试出现一个This is a long name txt.TXT。您移植先完成这个在说后面修改为您自己的所需的长文件名。


您好,按照例程的话,创建不出来,在U盘上只能看见短文件名文件,现在发现好像要是13倍数的字符(比如26,39个字符)的文件名才能创建成功,但是第13个字符是乱码,并且创建的文件大小一样大,2.67G,像我发的图片那样


image.png

创建长文件名 字符个数不是13倍数的文件名文件从winhex上看是有创建,但是在pc上打开U盘只有对应的短文件名文件



您好,如果你是直接使用我发给您的例程也出现的这个问题,您可以打印看一下报错信息,看是否是执行到某一步的时候,有错误返回。


image.png


您好,感谢您的回复!这是我打印出来的信息,看这个的话有创建成功,但是从PC机上看U盘里只有短文件名文件

程序:


UINT8CH376CreateLongName( PUINT8 PathName, PUINT8 LongName )  

{

UINT8s, i;

UINT8DirBlockCnt;

UINT16count;

UINT16NameCount;

UINT32NewFileLoc;

for ( count = 0; count < LONG_NAME_BUF_LEN; count += 2 ) if ( *(PUINT16)(&LongName[count]) == 0 ) break;  

if ( count == 0 || count >= LONG_NAME_BUF_LEN || count > LONE_NAME_MAX_CHAR ) return( ERR_LONG_NAME_ERR ); 

DirBlockCnt = count / LONG_NAME_PER_DIR;  

i = count - DirBlockCnt * LONG_NAME_PER_DIR;

if ( i ) { 

if ( ++ DirBlockCnt * LONG_NAME_PER_DIR > LONG_NAME_BUF_LEN ) return( ERR_LONG_BUF_OVER ); 

count += 2;  

i += 2;

if ( i < LONG_NAME_PER_DIR ) {  

while ( i++ < LONG_NAME_PER_DIR ) LongName[count++] = 0xFF;  

}

}

    

s = CH376FileOpenPath( PathName );  

printf("1 s = %X\r\n", s);

    if ( s == USB_INT_SUCCESS ) {  

s = ERR_NAME_EXIST;

goto CH376CreateLongNameE;

}

if ( s != ERR_MISS_FILE ) return( s );

    s = CH376FileCreatePath( PathName );  

printf("2 s = %X\r\n", s);    

    if ( s != USB_INT_SUCCESS ) return( s );

i = CH376ReadVar8( VAR_FILE_DIR_INDEX ); 

    s = CH376LocateInUpDir( PathName );  

printf("3 s = %X\r\n", s);

    if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;  

NewFileLoc = CH376ReadVar32( VAR_CURRENT_OFFSET ) + i * sizeof(FAT_DIR_INFO);  

    s = CH376ByteLocate( NewFileLoc );  

printf("4 s = %X\r\n", s);

    if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

    s = CH376ByteRead( &GlobalBuf[ sizeof(FAT_DIR_INFO) ], sizeof(FAT_DIR_INFO), NULL ); 

printf("5 s = %X\r\n", s);

    if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

for ( i = DirBlockCnt; i != 0; -- i ) {  

        s = CH376ByteRead( GlobalBuf, sizeof(FAT_DIR_INFO), &count ); 

printf("6 s = %X\r\n", s);

        if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

if ( count == 0 ) break;  

if ( GlobalBuf[0] && GlobalBuf[0] != 0xE5 ) {  

            s = CH376ByteLocate( NewFileLoc ); 

printf("7 s = %X\r\n", s);

            if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

GlobalBuf[ 0 ] = 0xE5;  

for ( s = 1; s != sizeof(FAT_DIR_INFO); s ++ ) GlobalBuf[ s ] = GlobalBuf[ sizeof(FAT_DIR_INFO) + s ];

            s = CH376LongNameWrite( GlobalBuf, sizeof(FAT_DIR_INFO) );  

printf("8 s = %X\r\n", s);

            if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

do {  

                s = CH376ByteRead( GlobalBuf, sizeof(FAT_DIR_INFO), &count );  

printf("9 s = %X\r\n", s);

                if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

} while ( count && GlobalBuf[0] ); 

NewFileLoc = CH376ReadVar32( VAR_CURRENT_OFFSET );  

i = DirBlockCnt + 1;  

if ( count == 0 ) break; 

NewFileLoc -= sizeof(FAT_DIR_INFO); 

}

}

    printf("i = %d\r\n", i);

if ( i ) { 

s = CH376ReadVar8( VAR_SEC_PER_CLUS );  

printf("10 s = %d\r\n", s);

        if ( s == 128 ) {  

s = ERR_FDT_OVER;  

goto CH376CreateLongNameE;

}

count = s * DEF_SECTOR_SIZE;  

if ( count < i * sizeof(FAT_DIR_INFO) ) count <<= 1;  

s = CH376LongNameWrite( NULL, count ); 

printf("11 s = %d\r\n", s);

        if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

}

s = CH376ByteLocate( NewFileLoc );  

printf("12 s = %X\r\n", s);

    if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

GlobalBuf[11] = ATTR_LONG_NAME;

GlobalBuf[12] = 0x00;

GlobalBuf[13] = CH376CheckNameSum( &GlobalBuf[ sizeof(FAT_DIR_INFO) ] );  

GlobalBuf[26] = 0x00;

GlobalBuf[27] = 0x00;

    printf("GlobalBuf[11] = %X, GlobalBuf[13] = %X, DirBlockCnt = %d\r\n", GlobalBuf[11], GlobalBuf[13], DirBlockCnt);

for ( s = 0; DirBlockCnt != 0; ) {  

GlobalBuf[0] = s ? DirBlockCnt : DirBlockCnt | 0x40;  

        printf("GlobalBuf[0] = %X\r\n", GlobalBuf[0]);

DirBlockCnt --;

NameCount = DirBlockCnt * LONG_NAME_PER_DIR;

        printf("NameCount = %d, sizeof(FAT_DIR_INFO) = %d\r\n", NameCount, sizeof(FAT_DIR_INFO));

for ( s = 1; s < sizeof( FAT_DIR_INFO ); s += 2 ) {  

if ( s == 1 + 5 * 2 ) s = 14; 

else if ( s == 14 + 6 * 2 ) s = 28;  

GlobalBuf[ s ] = LongName[ NameCount++ ];

GlobalBuf[ s + 1 ] = LongName[ NameCount++ ];

}

        for(i = 0; i < sizeof(FAT_DIR_INFO); i++)

        {

            printf("%X ", GlobalBuf[i]);

        }

        printf("\r\n");

s = CH376LongNameWrite( GlobalBuf, sizeof(FAT_DIR_INFO) ); 

printf("13 s = %X\r\n", s);

        if ( s != USB_INT_SUCCESS ) goto CH376CreateLongNameE;

}

s = CH376LongNameWrite( &GlobalBuf[ sizeof(FAT_DIR_INFO) ], sizeof(FAT_DIR_INFO) );  

    printf("14 s = %X\r\n", s);

CH376CreateLongNameE:

CH376FileClose( FALSE );  

return( s );

}

l劳烦帮我再看下



您好,您复制的这段是File_SYS.C里面的驱动代码,这部分是不需要进行修改的,直接使用官方EVT里的内容即可。主要修改的地方是在主程序while(1)里面的代码。看您的打印,短文件名和长文件名的文件格式是不一样的。您可以先用TXT文本试一下,只修改文件名称,不修改文件格式。看看电脑是否正常显示。


只有登录才能回复,可以选择微信账号登录