实在没办法了,所以向你们求助,下面的代码可以正确枚举U盘的所有文件,也可以辨别出MP3文件并可以打印printf( "This is a .MP3 file\n" ); 但是当我想要只保存为MP3扩展名的文件的时候,程序却无法成功枚举任何文件,调试知道是在 if ( s == USB_INT_DISK_READ ) 判断时候导致退出。
**********************修改前的程序************************************************
while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { /* 请求数据读出 */ /* 在文件枚举过程中,不能执行其它可能产生中断的操作命令,例如,如果需要获取长文件名,那么可以将枚举出的文件名保存,并在枚举结束后获取其长文件名 */ CH376ReadBlock( buf ); /* 读取枚举到的文件的FAT_DIR_INFO结构,返回长度总是sizeof( FAT_DIR_INFO ) *///IMPORTANT xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 继续枚举文件和目录,先发出下一个命令再分析上行读出的数据可以让CH376与单片机分别同时工作,提高速度 */ xEndCH376Cmd( ); pDir = (P_FAT_DIR_INFO)buf; /* 当前文件目录信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本级或者上级目录名则继续,否则必须丢弃不处理 */ if ( pDir -> DIR_Name[0] == 0x05 ) pDir -> DIR_Name[0] = 0xE5; /* 特殊字符替换 */ if ( pDir -> DIR_Name[8] == 'M' && pDir -> DIR_Name[9] == 'P' && pDir -> DIR_Name[10] == '3' ) { printf( "This is a .MP3 file\n" ); /* 比较文件扩展名分析文件类型的范例 */ } if ( FileCount < 40 ) { /* 文件名结构缓冲区足够 */ pNameBuf =(PUINT8)(& FileNameBuffer[ FileCount ].Name); /* 文件名结构中的文件名缓冲区 */ for ( s = 0; s < 11; s ++ ) { /* 复制文件名,长度为11个字符 */ if ( pDir -> DIR_Name[ s ] != 0x20 ) { /* 有效字符 */ if ( s == 8 ) { /* 处理扩展名 */ *pNameBuf = '.'; /* 分隔符 */ pNameBuf ++; } *pNameBuf = pDir -> DIR_Name[ s ]; /* 复制文件名的一个字符 */ pNameBuf ++; } } *pNameBuf = 0; /* 当前文件名完整路径的结束符 */ FileNameBuffer[ FileCount ].DirStartClust = CurrentDirStartClust; /* 记录当前目录的起始簇号,用于加快文件打开速度 */ FileNameBuffer[ FileCount ].Attr = pDir -> DIR_Attr; /* 记录文件属性 */ if ( pDir -> DIR_Attr & ATTR_DIRECTORY ) printf( "Dir %4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name ); /* 判断是目录名 */ else printf( "File%4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name ); /* 判断是文件名 */ FileCount ++; /* 子目录计数 */ } else { /* 文件名结构缓冲区太小,结构数量不足 */ printf( "FileName Structure Full\n" ); s = Wait376Interrupt( ); CH376EndDirInfo( ); /* 获取完FAT_DIR_INFO结构 */ break; /* 强行终止枚举 */ } } } else { if ( s == ERR_MISS_FILE ) s = USB_INT_SUCCESS; /* 没有找到更多的匹配文件 */ break; } }
**********************修改后的程序***********只是把文件结构保存放在了MP3判断成功以后进行********************************************************
while ( 1 ) { s = Wait376Interrupt( ); if ( s == USB_INT_DISK_READ ) { /* 请求数据读出 */ /* 在文件枚举过程中,不能执行其它可能产生中断的操作命令,例如,如果需要获取长文件名,那么可以将枚举出的文件名保存,并在枚举结束后获取其长文件名 */ CH376ReadBlock( buf ); /* 读取枚举到的文件的FAT_DIR_INFO结构,返回长度总是sizeof( FAT_DIR_INFO ) *///IMPORTANT xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 继续枚举文件和目录,先发出下一个命令再分析上行读出的数据可以让CH376与单片机分别同时工作,提高速度 */ xEndCH376Cmd( ); pDir = (P_FAT_DIR_INFO)buf; /* 当前文件目录信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本级或者上级目录名则继续,否则必须丢弃不处理 */ if ( pDir -> DIR_Name[0] == 0x05 ) pDir -> DIR_Name[0] = 0xE5; /* 特殊字符替换 */ if ( pDir -> DIR_Name[8] == 'M' && pDir -> DIR_Name[9] == 'P' && pDir -> DIR_Name[10] == '3' ) { printf( "This is a .MP3 file\n" ); /* 比较文件扩展名分析文件类型的范例 */ if ( FileCount < 40 ) { /* 文件名结构缓冲区足够 */ pNameBuf =(PUINT8)(& FileNameBuffer[ FileCount ].Name); /* 文件名结构中的文件名缓冲区 */ for ( s = 0; s < 11; s ++ ) { /* 复制文件名,长度为11个字符 */ if ( pDir -> DIR_Name[ s ] != 0x20 ) { /* 有效字符 */ if ( s == 8 ) { /* 处理扩展名 */ *pNameBuf = '.'; /* 分隔符 */ pNameBuf ++; } *pNameBuf = pDir -> DIR_Name[ s ]; /* 复制文件名的一个字符 */ pNameBuf ++; } } *pNameBuf = 0; /* 当前文件名完整路径的结束符 */ FileNameBuffer[ FileCount ].DirStartClust = CurrentDirStartClust; /* 记录当前目录的起始簇号,用于加快文件打开速度 */ FileNameBuffer[ FileCount ].Attr = pDir -> DIR_Attr; /* 记录文件属性 */ if ( pDir -> DIR_Attr & ATTR_DIRECTORY ) printf( "Dir %4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name ); /* 判断是目录名 */ else printf( "File%4d#: %s\n", FileCount, FileNameBuffer[ FileCount ].Name ); /* 判断是文件名 */ FileCount ++; /* 子目录计数 */ } else { /* 文件名结构缓冲区太小,结构数量不足 */ printf( "FileName Structure Full\n" ); s = Wait376Interrupt( ); CH376EndDirInfo( ); /* 获取完FAT_DIR_INFO结构 */ break; /* 强行终止枚举 */ } } } } else { if ( s == ERR_MISS_FILE ) s = USB_INT_SUCCESS; /* 没有找到更多的匹配文件 */ break; } }