实在没办法了,到此处求助,唉

实在没办法了,所以向你们求助,下面的代码可以正确枚举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; } }

保存文件名和CH376做枚举工作没什么关系, 是不是RAM上有冲突导致的。


RAM上有冲突?能说得详细点吗? 我就搞不明白了,基本上逻辑上是没问题的,不就是变成过滤之后确认是MP3才保存的程序,为啥就是运行不了。 我刚刚调试了下,打得开根目录,但是真正到枚举文件之后就跳出来了。。。希望wch的工程师可以给力啊!


MP3文件保存到什么地方了?在枚举的过程中,单片机可以做其他的事情,不能执行其它可能产生中断的操作命令


1.MP3文件是保存在U盘,我只是依次枚举到它时候,然后判断枚举到的文件是否是MP3文件,是则把短文件名保存在pDir结构体里面,如下是我的软件过滤的函数,可惜无法运行。 2.乍看下没看到有产生中断的指令,不过我觉得应该是有的,但是我没找到。。。 唉??? /*******************************************************/ 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; /* 强行终止枚举 */ } }


而当我不过滤保存的时候,整个枚举过程一点问题都没有,程序如下:(具体程序上下文可看一楼)

/******************************************************/

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; /* 强行终止枚举 */ }


程序的结构本来是: if(是MP3后缀的文件) 是则进入if打印This is a .MP3 file 否则向下执行 保存文件名到构建的文件名结构体(FileNameBuffer)里面。 回到大循环继续判断保持

我修改后是这样的: if(是MP3后缀的文件) 是则进入if并打印This is a .MP3 file,并且保持该文件名到构建的文件名结构体(FileNameBuffer)里面。 否则向下执行 回到大循环继续判断保持

这个就是我修改程序的逻辑。我怕上面的具体代码太多,大家看不出来。但就是这样一个修改前后的程序,前一个正常,而后一个却退出了,希望高手能助我一臂之力,在此先谢过了。


前一个没有筛选就保存,所以会保存U盘里所有枚举到的文件,造成ram的浪费。 而后一个筛选后保存,只保存.mp3文件,但是程序却无法执行。


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