返回0x31

搜索文件名有的时候ch375Result会返回0x31错误码,不知道什么原因,导致文件名与序号不能对上

for ( searchFileIndex = 0; searchFileIndex < 255; searchFileIndex++ ) /* 最多搜索前255个文件 */ { OS_ENTER_CRITICAL(); strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ i = strlen( (char const *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */ mCmdParam.Open.mPathName[ i ] = searchFileIndex; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ ch375Result = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ OS_EXIT_CRITICAL(); if ( ch375Result == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( ch375Result == ERR_FOUND_NAME ) /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ { nameLen = strlen( (char const *)mCmdParam.Open.mPathName ); if(nameLen < 4) continue; pExt = ((char *)mCmdParam.Open.mPathName) + nameLen - 4; if(strcmp(pExt, (char *)".MP3") == 0 || strcmp(pExt, (char *)".WMA") == 0 ) { OS_ENTER_CRITICAL(); if(usb_scan_play_flag == 0) { usb_total_song_num++; } ch375Result = CH375FileOpen( ); /* 打开文件 */ OS_EXIT_CRITICAL(); if ( ch375Result != ERR_MISS_DIR && ch375Result != ERR_MISS_FILE ) { OS_ENTER_CRITICAL(); if(usb_scan_play_flag == 1) { for(i = 0; i < 15; i++) { usb_name_buf[i] = mCmdParam.Open.mPathName[i]; } } else { DROPDOWN_AddString(dropdown0_usb, (const char*)mCmdParam.Open.mPathName);//添加文件名至下拉菜单 } OS_EXIT_CRITICAL(); } if(usb_scan_play_flag == 1) { OS_ENTER_CRITICAL(); usb_song_count_temp--; OS_EXIT_CRITICAL(); if(usb_song_count_temp == 0) { return 99; } } }

} else /* 出错 */ { TEXT_SetText(text5_usb, "读取失败"); return 99; }文字

这个枚举程序流程没有问题,可以试试把ch375Result = CH375FileOpen( )改为ch375Result = CH375FileEnumer(),功能是一样的,你DISKREDY通过了没有,pCodeStr 里面的内容是什么?把硬件原理发至我邮箱


相关文件发给您邮箱里了


问题依然有,一般扫描次数多了就会有错误0x31,如果只扫描前几个文件不会出现问题


刚试了下,在C51文件夹中有2,30个文件,结果都能枚举出来,没有返回0x31的错误。你每查找一次前你把pCodeStr里面的数据打印出来,看看有没有错误。你在ch375Result = CH375FileOpen( ); 后面如果找到文件你就把文件名打印出来,继续枚举文件,暂时不要处理你后面的程序,我怀疑是pCodeStr在你后面的程序被改变


为什么要在C51文件夹里面扫描,我的程序是扫描根目录下的文件,我在出错的地方查看mCmdParam.Open.mPathName和pCodeStr的值,串口打印出来都对,还是会返回0x31错误,下面是我的扫描程序 -------------------------------------------------------------------------------------- u8 ch375_scan_song(void) { INT8U searchFileIndex, ch375Result, nameLen, i; u8 usb_song_count_temp; char *pCodeStr, *pExt; usb_song_count_temp = usb_song_count; CH375Reset(); if(usb_scan_play_flag == 0) { CH375_Init(); } ch375Result = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ // while ( CH375DiskStatus < DISK_CONNECT ) /* 查询CH375中断并更新中断状态,等待U盘插入 */ // { // if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ // } while ( 1 ) { /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 10; i++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */ { if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ }

pCodeStr = (char *)"\\*"; /* 列出根目录下的文件 */ for ( searchFileIndex = 0; searchFileIndex < 255; searchFileIndex++ ) /* 最多搜索前255个文件 */ { OS_ENTER_CRITICAL(); strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ i = strlen( (char const *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */ mCmdParam.Open.mPathName[ i ] = searchFileIndex; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ ch375Result = CH375FileEnumer( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ OS_EXIT_CRITICAL(); if ( ch375Result == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( ch375Result == ERR_SUCCESS ) /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ { nameLen = strlen( (char const *)mCmdParam.Open.mPathName ); if(nameLen < 4) continue; pExt = ((char *)mCmdParam.Open.mPathName) + nameLen - 4; if(strcmp(pExt, (char *)".MP3") == 0 || strcmp(pExt, (char *)".WMA") == 0 ) { OS_ENTER_CRITICAL(); if(usb_scan_play_flag == 0) { usb_total_song_num++; } ch375Result = CH375FileOpen( ); /* 打开文件 */ OS_EXIT_CRITICAL(); if ( ch375Result != ERR_MISS_DIR && ch375Result != ERR_MISS_FILE ) { OS_ENTER_CRITICAL(); if(usb_scan_play_flag == 1) { for(i = 0; i < 15; i++) { usb_name_buf[i] = mCmdParam.Open.mPathName[i]; } } else { DROPDOWN_AddString(dropdown0_usb, (const char*)mCmdParam.Open.mPathName);//添加文件名至下拉菜单 } OS_EXIT_CRITICAL(); } if(usb_scan_play_flag == 1) { OS_ENTER_CRITICAL(); usb_song_count_temp--; OS_EXIT_CRITICAL(); if(usb_song_count_temp == 0) { return 99; } } }

} else /* 出错 */ { printf("\r\n%s\r\n", mCmdParam.Open.mPathName);[color=Red] [color=Red]printf("\r\n%s\r\n", pCodeStr);[color=Red] TEXT_SetText(text5_usb, "读取失败"); return 99; } } if(play_pause_flag == 1)//判断播放暂停按钮 { TEXT_SetText(text5_usb, "正在播放"); } else { TEXT_SetText(text5_usb, "读取完毕"); } return 99; } } ----------------------------------------------------------- 2012112199133.jpg[color=Red]文字


不是一定在C51文件夹下,我是随便找的文件夹,根目录下一样的。你CH375DiskReady几次能过?还有你先只枚举,不要对枚举出来的文件做操作,先找出来原因,我们这边测试是可以的


你的枚举名有错误应该是"\\*"或者“/*”


CH375DiskReady一次就能过,还是不行呀


哦,刚试验过了,在根目录下有2,30个文件都可以枚举出来的,没有返回0x31错误。你先只枚举,不要对枚举出来的文件做操作或者你把strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr ); 改成 strcpy( (char *)mCmdParam.Open.mPathName, “\\*” ),担心你的处理程序对(char *)mCmdParam.Open.mPathName后面的几个字节值产生影响


下面是我扫描前的函数,我看了下串口,扫描出来的字符串,都是\*+名字+后缀,但是名字里面有乱码,扫描的时候我也没有做任何操作 strcpy( (char *)mCmdParam.Open.mPathName, "\\*" ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ i = strlen( (char const *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */ mCmdParam.Open.mPathName[ i ] = searchFileIndex; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ printf("\r\n%s\r\n", mCmdParam.Open.mPathName); ch375Result = CH375FileEnumer( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */

20121121186657.jpg


u8 ch375_scan_song(void) { INT8U searchFileIndex, ch375Result, nameLen, i; u8 usb_song_count_temp; char *pCodeStr, *pExt; usb_song_count_temp = usb_song_count; CH375Reset(); if(usb_scan_play_flag == 0) { CH375_Init(); } ch375Result = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ // while ( CH375DiskStatus < DISK_CONNECT ) /* 查询CH375中断并更新中断状态,等待U盘插入 */ // { // if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有设备连接则返回成功,CH375DiskConnect同时会更新全局变量CH375DiskStatus */ // } while ( 1 ) { /* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */ for ( i = 0; i < 10; i++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */ { if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */ } pCodeStr = (char *)"/*"; /* 列出根目录下的文件 */ for ( searchFileIndex = 0; searchFileIndex < 255; searchFileIndex++ ) /* 最多搜索前255个文件 */ { OS_ENTER_CRITICAL(); strcpy( (char *)mCmdParam.Open.mPathName, "/*" ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ i = strlen( (char const *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */ mCmdParam.Open.mPathName[ i ] = searchFileIndex; /* 根据字符串长度将结束符替换为搜索的序号,从0到255 */ printf("\r\n%s\r\n", mCmdParam.Open.mPathName); ch375Result = CH375FileEnumer( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ OS_EXIT_CRITICAL(); if ( ch375Result == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( ch375Result == ERR_SUCCESS ) /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ { OS_ENTER_CRITICAL(); nameLen = strlen( (char const *)mCmdParam.Open.mPathName ); if(nameLen < 4) continue; pExt = ((char *)mCmdParam.Open.mPathName) + nameLen - 4; OS_EXIT_CRITICAL(); if(strcmp(pExt, (char *)".MP3") == 0 || strcmp(pExt, (char *)".WMA") == 0) { if(usb_scan_play_flag == 0) { OS_ENTER_CRITICAL(); usb_total_song_num++; DROPDOWN_AddString(dropdown0_usb, (const char*)mCmdParam.Open.mPathName);//添加文件名至下拉菜单 OS_EXIT_CRITICAL(); } if(usb_scan_play_flag == 1) { OS_ENTER_CRITICAL(); usb_song_count_temp--; OS_EXIT_CRITICAL(); if(usb_song_count_temp == 0) { OS_ENTER_CRITICAL(); for(i = 0; i < 15; i++) { usb_name_buf[i] = mCmdParam.Open.mPathName[i]; } OS_EXIT_CRITICAL(); return 99; } } }

} else /* 出错 */ { printf("\r\n%s\r\n", "读取失败"); //printf("\r\n%s\r\n", mCmdParam.Open.mPathName); //printf("\r\n%s\r\n", pCodeStr); printf("\r\nch375Result:%x\r\n", ch375Result); TEXT_SetText(text5_usb, "读取失败"); return 99; } } if(play_pause_flag == 1)//判断播放暂停按钮 { TEXT_SetText(text5_usb, "正在播放"); } else { TEXT_SetText(text5_usb, "读取完毕"); } return 99; } }


乱码是你打印的位置不对,您按照下面的方法试试: pCodeStr = "\\*"; /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */ printf( "List file %s\n", pCodeStr ); for ( c = 0; c < 254; c ++ ) { /* 最多搜索前254个文件 */ i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ /* 另外一种枚举方法是,将此处的c置为0xFF,然后将真正的枚举序号存放于CH375vFileSize中,从而可以搜索大于254个文件,从0到2147483647个 */ mCmdParam.Open.mPathName[ i ] = c; /* 根据字符串长度将结束符替换为搜索的序号,从0到254 */ i = CH375FileOpen( ); /* 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开 */ if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ printf( " match file %03d#: %s\n", (unsigned int)c, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名 */ continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */ } else { /* 出错 */ mStopIfError( i ); break; } }


万工,时序对吗?


不是给你回过邮件了么?没收到?


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