用CH376S创建长文件名文件时,根据EXAM11例程创建文件,发现返回的数值是0x41,在电脑中查看U盘文件,短文件名文件有创建,长文件名没有创建,还有想知道这个短文件名和长文件名之间有什么对应关系吗,还是随意命名一个短文件名和长文件名都可以,劳烦求教
s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );
用CH376S创建长文件名文件时,根据EXAM11例程创建文件,发现返回的数值是0x41,在电脑中查看U盘文件,短文件名文件有创建,长文件名没有创建,还有想知道这个短文件名和长文件名之间有什么对应关系吗,还是随意命名一个短文件名和长文件名都可以,劳烦求教
s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );
创建出来的文件特别大,2.6G,文件名有乱码,想创建"20211009_LonGgFileName.HCD"这个文件名,求解答
您好,报错0x41表示您的短文件名文件已经被打开过,您确认一下这个返回值错误是否为创建文件后出现的。还是后面CH376GetLongName函数返回的错误,创建长文件的完整CH32F103工程,这边已经邮件回复您了,您可以根据工程做代码移植即可。
您好,我根据您发给我的CH32例程移植,发现创建出来的只显示短文件名文件,而且文件大小很大,这是怎么回事
您基于我那个代码移植的话,先不要修改内容,最终效果试出现一个This is a long name txt.TXT。您移植先完成这个在说后面修改为您自己的所需的长文件名。
您好,按照例程的话,创建不出来,在U盘上只能看见短文件名文件,现在发现好像要是13倍数的字符(比如26,39个字符)的文件名才能创建成功,但是第13个字符是乱码,并且创建的文件大小一样大,2.67G,像我发的图片那样
创建长文件名 字符个数不是13倍数的文件名文件从winhex上看是有创建,但是在pc上打开U盘只有对应的短文件名文件
您好,如果你是直接使用我发给您的例程也出现的这个问题,您可以打印看一下报错信息,看是否是执行到某一步的时候,有错误返回。
您好,感谢您的回复!这是我打印出来的信息,看这个的话有创建成功,但是从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文本试一下,只修改文件名称,不修改文件格式。看看电脑是否正常显示。