實在沒辦法了,到此處求助,唉

實在沒辦法了,所以向你們求助,下面的代碼可以正確枚舉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 ) { /* 請求數(shù)據(jù)讀出 */ /* 在文件枚舉過程中,不能執(zhí)行其它可能產生中斷的操作命令,例如,如果需要獲取長文件名,那么可以將枚舉出的文件名保存,并在枚舉結束后獲取其長文件名 */ CH376ReadBlock( buf ); /* 讀取枚舉到的文件的FAT_DIR_INFO結構,返回長度總是sizeof( FAT_DIR_INFO ) *///IMPORTANT xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 繼續(xù)枚舉文件和目錄,先發(fā)出下一個命令再分析上行讀出的數(shù)據(jù)可以讓CH376與單片機分別同時工作,提高速度 */ xEndCH376Cmd( ); pDir = (P_FAT_DIR_INFO)buf; /* 當前文件目錄信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本級或者上級目錄名則繼續(xù),否則必須丟棄不處理 */ 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 ) { /* 文件名結構緩沖區(qū)足夠 */ pNameBuf =(PUINT8)(& FileNameBuffer[ FileCount ].Name); /* 文件名結構中的文件名緩沖區(qū) */ 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 ++; /* 子目錄計數(shù) */ } else { /* 文件名結構緩沖區(qū)太小,結構數(shù)量不足 */ 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 ) { /* 請求數(shù)據(jù)讀出 */ /* 在文件枚舉過程中,不能執(zhí)行其它可能產生中斷的操作命令,例如,如果需要獲取長文件名,那么可以將枚舉出的文件名保存,并在枚舉結束后獲取其長文件名 */ CH376ReadBlock( buf ); /* 讀取枚舉到的文件的FAT_DIR_INFO結構,返回長度總是sizeof( FAT_DIR_INFO ) *///IMPORTANT xWriteCH376Cmd( CMD0H_FILE_ENUM_GO ); /* 繼續(xù)枚舉文件和目錄,先發(fā)出下一個命令再分析上行讀出的數(shù)據(jù)可以讓CH376與單片機分別同時工作,提高速度 */ xEndCH376Cmd( ); pDir = (P_FAT_DIR_INFO)buf; /* 當前文件目錄信息 */ if ( pDir -> DIR_Name[0] != '.' ) { /* 不是本級或者上級目錄名則繼續(xù),否則必須丟棄不處理 */ 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 ) { /* 文件名結構緩沖區(qū)足夠 */ pNameBuf =(PUINT8)(& FileNameBuffer[ FileCount ].Name); /* 文件名結構中的文件名緩沖區(qū) */ 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 ++; /* 子目錄計數(shù) */ } else { /* 文件名結構緩沖區(qū)太小,結構數(shù)量不足 */ 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的工程師可以給力?。?/p>


MP3文件保存到什么地方了?在枚舉的過程中,單片機可以做其他的事情,不能執(zhí)行其它可能產生中斷的操作命令


1.MP3文件是保存在U盤,我只是依次枚舉到它時候,然后判斷枚舉到的文件是否是MP3文件,是則把短文件名保存在pDir結構體里面,如下是我的軟件過濾的函數(shù),可惜無法運行。 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 ) { /* 文件名結構緩沖區(qū)足夠 */ pNameBuf =(PUINT8)(& FileNameBuffer[ FileCount ].Name); /* 文件名結構中的文件名緩沖區(qū) */ 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 ++; /* 子目錄計數(shù) */ } else { /* 文件名結構緩沖區(qū)太小,結構數(shù)量不足 */ 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 ) { /* 文件名結構緩沖區(qū)足夠 */ pNameBuf =(PUINT8)(& FileNameBuffer[ FileCount ].Name); /* 文件名結構中的文件名緩沖區(qū) */ 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 ++; /* 子目錄計數(shù) */ } else { /* 文件名結構緩沖區(qū)太小,結構數(shù)量不足 */ printf( "FileName Structure Full\n" ); s = Wait376Interrupt( ); CH376EndDirInfo( ); /* 獲取完FAT_DIR_INFO結構 */ break; /* 強行終止枚舉 */ }


程序的結構本來是: if(是MP3后綴的文件) 是則進入if打印This is a .MP3 file 否則向下執(zhí)行 保存文件名到構建的文件名結構體(FileNameBuffer)里面。 回到大循環(huán)繼續(xù)判斷保持

我修改后是這樣的: if(是MP3后綴的文件) 是則進入if并打印This is a .MP3 file,并且保持該文件名到構建的文件名結構體(FileNameBuffer)里面。 否則向下執(zhí)行 回到大循環(huán)繼續(xù)判斷保持

這個就是我修改程序的邏輯。我怕上面的具體代碼太多,大家看不出來。但就是這樣一個修改前后的程序,前一個正常,而后一個卻退出了,希望高手能助我一臂之力,在此先謝過了。


前一個沒有篩選就保存,所以會保存U盤里所有枚舉到的文件,造成ram的浪費。 而后一個篩選后保存,只保存.mp3文件,但是程序卻無法執(zhí)行。


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频