关于读长文件名文件问题

您好, 我通过CH376GetLongName函数来读取文件的长文件名。 正好U盘里面有一个文件名很长的文件,文件名为:“[]进站必看.播放器.更新11。13 - 随便扯扯 - 544255355 QQ日志 - qq五月天qqmay.com__TITLE__META http-equi.mp3”。结果软件走不出CH376GetLongName函数。 结果通过仿真器发现,程序一直停在函数UINT8 CH376LocateInUpDir( PUINT8 PathName )中的while循环中。 全局缓冲区的定义为:u8 GlobalBuf[512]; 请问这个是什么样的问题呢? 是无法避免的,还是通过什么设置能够通过?

谢谢。

按照获取长文件名函数里面应该还有一个长文件名缓冲区。这个缓冲区就是u8 GlobalBuf[512];吗?按照FAT文件系统来说,最长的长文件名字符个数是不会超过512的,可能需要你去看下你的程序停在哪个步骤出现问题。


不会的,这个函数应该会有返回值,你的长文件名的短文件名是什么?你前面的376初始化和376DISKMOUNT过了没有


UploadImages/201210169361869.rar


376初始化和376DISKMOUNT是能够通过的。 软件会在CH376LocateInUpDir函数中的以下一个循环中,退不出来。 while ( 1 ) { /* 不断移动文件指针,直到与当前文件目录信息所在的扇区LBA地址匹配 */ s = CH376SecLocate( *(PUINT32)(&GlobalBuf[0]) ); /* 以扇区为单位在上级目录中移动文件指针 */ if ( s != USB_INT_SUCCESS ) return( s ); CH376ReadBlock( &GlobalBuf[8] ); /* 从内存缓冲区读取CH376_CMD_DATA.SectorLocate.mSectorLba数据块,返回长度总是sizeof(CH376_CMD_DATA.SectorLocate) */ if ( *(PUINT32)(&GlobalBuf[8]) == *(PUINT32)(&GlobalBuf[4]) ) return( USB_INT_SUCCESS ); /* 已到当前文件目录信息扇区 */ xWriteCH376Cmd( CMD50_WRITE_VAR32 ); xWriteCH376Data( VAR_FAT_DIR_LBA ); /* 得到前一个扇区,设置为新的文件目录信息扇区LBA地址 */ for ( s = 8; s != 12; s ++ ) xWriteCH376Data( GlobalBuf[ s ] ); xEndCH376Cmd( ); ++ *(PUINT32)(&GlobalBuf[0]); }


上面是我们提供的测试可以通过的例子程序。你拿这个例子程序测试。


我也是遇到这种情况,在CH376LocateInUpDir函数中while循环不出来,有个疑问: for ( s = 4; s != 8; s ++ ) { GlobalBuf[ s ] = xReadCH376Data( ); /* 临时保存于全局缓冲区中,节约RAM */ } 这个给GlobalBuf[4]~GlobalBuf[7]赋值了,但接下来有条语句: *(PUINT32)(&GlobalBuf[0]) = 0; /* 目录扇区偏移扇区数,保存在全局缓冲区中,节约RAM */ 结果又把GlobalBuf[0]~GlobalBuf[7]全变为0x00了,这是为什么呢?


这可能跟你的单片机有关,我们前面是给GlobalBuf[4]~GlobalBuf[7]赋值,后面是给GlobalBuf[0]~GlobalBuf[3]赋0x00,PUINT32是32位四字节长度不会把GlobalBuf[4]~GlobalBuf[7]赋0x00.


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