用CH376S創(chuàng)建長文件名文件時,根據(jù)EXAM11例程創(chuàng)建文件,發(fā)現(xiàn)返回的數(shù)值是0x41,在電腦中查看U盤文件,短文件名文件有創(chuàng)建,長文件名沒有創(chuàng)建,還有想知道這個短文件名和長文件名之間有什么對應(yīng)關(guān)系嗎,還是隨意命名一個短文件名和長文件名都可以,勞煩求教
s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );
用CH376S創(chuàng)建長文件名文件時,根據(jù)EXAM11例程創(chuàng)建文件,發(fā)現(xiàn)返回的數(shù)值是0x41,在電腦中查看U盤文件,短文件名文件有創(chuàng)建,長文件名沒有創(chuàng)建,還有想知道這個短文件名和長文件名之間有什么對應(yīng)關(guān)系嗎,還是隨意命名一個短文件名和長文件名都可以,勞煩求教
s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf );
創(chuàng)建出來的文件特別大,2.6G,文件名有亂碼,想創(chuàng)建"20211009_LonGgFileName.HCD"這個文件名,求解答
您好,報錯0x41表示您的短文件名文件已經(jīng)被打開過,您確認(rèn)一下這個返回值錯誤是否為創(chuàng)建文件后出現(xiàn)的。還是后面CH376GetLongName函數(shù)返回的錯誤,創(chuàng)建長文件的完整CH32F103工程,這邊已經(jīng)郵件回復(fù)您了,您可以根據(jù)工程做代碼移植即可。
您好,我根據(jù)您發(fā)給我的CH32例程移植,發(fā)現(xiàn)創(chuàng)建出來的只顯示短文件名文件,而且文件大小很大,這是怎么回事
您基于我那個代碼移植的話,先不要修改內(nèi)容,最終效果試出現(xiàn)一個This is a long name txt.TXT。您移植先完成這個在說后面修改為您自己的所需的長文件名。
您好,按照例程的話,創(chuàng)建不出來,在U盤上只能看見短文件名文件,現(xiàn)在發(fā)現(xiàn)好像要是13倍數(shù)的字符(比如26,39個字符)的文件名才能創(chuàng)建成功,但是第13個字符是亂碼,并且創(chuàng)建的文件大小一樣大,2.67G,像我發(fā)的圖片那樣
創(chuàng)建長文件名 字符個數(shù)不是13倍數(shù)的文件名文件從winhex上看是有創(chuàng)建,但是在pc上打開U盤只有對應(yīng)的短文件名文件
您好,如果你是直接使用我發(fā)給您的例程也出現(xiàn)的這個問題,您可以打印看一下報錯信息,看是否是執(zhí)行到某一步的時候,有錯誤返回。
您好,感謝您的回復(fù)!這是我打印出來的信息,看這個的話有創(chuàng)建成功,但是從PC機(jī)上看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勞煩幫我再看下
您好,您復(fù)制的這段是File_SYS.C里面的驅(qū)動代碼,這部分是不需要進(jìn)行修改的,直接使用官方EVT里的內(nèi)容即可。主要修改的地方是在主程序while(1)里面的代碼??茨拇蛴?,短文件名和長文件名的文件格式是不一樣的。您可以先用TXT文本試一下,只修改文件名稱,不修改文件格式??纯措娔X是否正常顯示。