各位大虾:
如题。
短文件名读写操作都没问题,最近想要对长文件名进行操作,可是按照例程11,创建都不成功。无法得到长文件名,只能得到短文件名。请大虾们指导指导,谢谢!!!
各位大虾:
如题。
短文件名读写操作都没问题,最近想要对长文件名进行操作,可是按照例程11,创建都不成功。无法得到长文件名,只能得到短文件名。请大虾们指导指导,谢谢!!!
定义的长文件名:UINT8 code LongName2[] =
{
"This is Long Name File !!!.H"
};
主程序参照例程11,
for ( j = 0; LongName2[j] != 0; j++ ) { /* 复制并转换长文件名到LongNameBuf长文件名缓冲区 */
LongNameBuf[j*2] = LongName2[j]; /* 将英文字符转换为两字节的小端UNICODE编码 */
LongNameBuf[j*2+1] = 0x00;
}
LongNameBuf[j*2] = 0x00; // 末尾用两个0表示结束
LongNameBuf[j*2+1] = 0x00;
// strcpy( PathNameBuf, "/LONGNAME.H" ); // 复制该长文件名的ANSI编码的全路径的短文件名(8+3格式),短文件名由长文件名生成(只要不冲突,其实随便定)
s = CH376CreateLongName( "/LONGNAME.H", LongNameBuf ); /* 新建具有长文件名的文件 */
单步发现我的程序在这个函数while里出不去
UINT8 CH376LocateInUpDir( PUINT8 PathName ) /* 在上级目录(文件夹)中移动文件指针到当前文件目录信息所在的扇区 */
/* 另外,顺便将当前文件目录信息所在的扇区的前一个扇区的LBA地址写入CH376内部VAR_FAT_DIR_LBA变量(为了方便收集长文件名时向前搜索,否则要多移动一次) */
/* 使用了全局缓冲区GlobalBuf的前12个字节 */
{
UINT8 s;
xWriteCH376Cmd( CMD14_READ_VAR32 );
xWriteCH376Data( VAR_FAT_DIR_LBA ); /* 当前文件目录信息所在的扇区LBA地址 */
for ( s = 4; s != 8; s ++ ) GlobalBuf[ s ] = xReadCH376Data( ); /* 临时保存于全局缓冲区中,节约RAM */
//xEndCH376Cmd( );
s = CH376SeparatePath( PathName ); /* 从路径中分离出最后一级文件名或者目录名,返回最后一级文件名或者目录名的偏移 */
if ( s ) s = CH376FileOpenDir( PathName, s ); /* 是多级目录,打开多级目录下的最后一级目录,即打开文件的上级目录 */
else s = CH376FileOpen( "/" ); /* 根目录下的文件,则打开根目录 */
if ( s != ERR_OPEN_DIR ) return( s );
*(PUINT32)(&GlobalBuf[0]) = 0; /* 目录扇区偏移扇区数,保存在全局缓冲区中,节约RAM */
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]);
}
}
读到的GlobalBuf[4]--[ 7 ] 数值很大 为:0x28 0x5A 0x80 0x80 怎么回事?
这个函数里面CH376SecLocate这个值返回是多少?这个函数实际上就是找空闲的目录项在填长文件名。
返回值是0x14
也抓到过为0的时候
蒙圈了
有没有哪位遇见过呢?求赐教。折腾了一个星期了。
0X14怎么会退出不来函数呢?单片机和CH376之间的接口是哪个接口?串口?SPI?并口?
已经得到解答了,我的单片机和CH376是串口通信,按照例程是不能实现长文件名的,必须修改串口发送命令函数,就是要在发送完两个同步码后清空接收缓存区及FIFO。
但是目前我还没有时间测试,因为刚好有预留的SPI方式通信,所以直接改成SPI方式了,已经可以实现对长文件名的操作了。 等项目结束,有空的时候,再测测串口方式。十分感谢大家对我的帮助,尤其是贵公司蔡工。