学前班
最后登录1970-1-1
在线时间 小时
注册时间2013-6-5
|
本帖最后由 yxliank 于 2013-6-8 16:54 编辑
我在做MP3的示例中遇到一个奇怪的问题:
当文件名为001.MP3;002MP3;……010MP3时,程序在运行时,播放了一个文件就自动跳出了。我在程序中增加串口的测试点,串口接收的输入如图。
奇怪的是在文件名字更改为:中文001.MP3;中文002MP3;……中文010MP3时,一切就都正常了。
这是什么原因呢???求大虾给个分析。
程序:
void MP3_Play(void)
{
FATFS fs; // Work area (file system object) for logical drive
FRESULT res;
UINT br; /*读取出的字节数,用于判断是否到达文件尾*/
FIL fsrc; // file objects
FILINFO finfo; /*文件信息*/
DIR dirs;
uint16_t count = 0;
char lfn[70]; /*为支持长文件的数组,[]最大支持255*/
char j = 0;
char path[100] = {""}; /* MicroSD卡根目录 */
char *result1, *result2, *result3, *result4;
BYTE buffer[512]; /* 存放读取出的文件数据 */
finfo.lfname = lfn; /*为长文件名分配空间*/
finfo.lfsize = sizeof(lfn); /*空间大小*/
f_mount(0, &fs); /* 挂载文件系统到0区 */
if (f_opendir(&dirs,path) == FR_OK) /* 打开根目录 */
{
while (f_readdir(&dirs, &finfo) == FR_OK) /* 依次读取文件名 */
{
if ( finfo.fattrib & AM_ARC ) /* 判断是否为存档型文档 */
{
if(finfo.lfname[0] == NULL && finfo.fname !=NULL) /*当长文件名称为空,短文件名非空时转换*/
{ printf( "测试点1 \r\n" );
finfo.lfname =finfo.fname;
}
if( !finfo.lfname[0] ) /* 文件名为空即到达了目录的末尾,退出 */
{ printf( "测试点2 \r\n" );
break;
}
printf( " \r\n 文件名为: %s \r\n",finfo.lfname );
result1 = strstr( finfo.lfname, ".mp3" ); /* 判断是否为音频文件 */
result2 = strstr( finfo.lfname, ".mid" );
result3 = strstr( finfo.lfname, ".wav" );
result4 = strstr( finfo.lfname, ".wma" );
if ( result1!=NULL || result2!=NULL || result3!=NULL || result4!=NULL )
{
if(result1 != NULL)/*若是mp3文件则读取mp3的信息*/
{
res = f_open( &fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ ); /* 以只读方式打开 */
/* 获取歌曲信息(ID3V1 tag / ID3V2 tag) */
if ( Read_ID3V1(&fsrc, &id3v1) == TRUE )
{// ID3V1 tag
printf( "\r\n 曲目 :%s \r\n", id3v1.title );
printf( "\r\n 艺术家 :%s \r\n", id3v1.artist );
printf( "\r\n 专辑 :%s \r\n", id3v1.album );
}
else
{// 有些MP3文件没有ID3V1 tag,只有ID3V2 tag
res = f_lseek(&fsrc, 0);
Read_ID3V2(&fsrc, &id3v2);
printf( "\r\n 曲目 :%s \r\n", id3v2.title );
printf( "\r\n 艺术家 :%s \r\n", id3v2.artist );
}
}
/* 使文件指针 fsrc 重新指向文件头,因为在调用Read_ID3V1/Read_ID3V2时,
fsrc 的位置改变了 */
res = f_open( &fsrc, finfo.lfname, FA_OPEN_EXISTING | FA_READ );
res = f_lseek(&fsrc, 0);
br = 1; /* br 为全局变量 */
TXDCS_SET( 0 ); /* 选择VS1003的数据接口 */
/* ------------------- 一曲开始 --------------------*/
printf( " \r\n 开始播放 \r\n" );
for (;;)
{
res = f_read( &fsrc, buffer, sizeof(buffer), &br );
if ( res == 0 )
{
count = 0; /* 512字节完重新计数 */
Delay_us( 1000 ); /* 10ms 延时 */
while ( count < 512) /* SD卡读取一个sector,一个sector为512字节 */
{
if ( DREQ != 0 ) /* 等待DREQ为高,请求数据输入 */
{
for (j=0; j<32; j++ ) /* VS1003的FIFO只有32个字节的缓冲 */
{
VS1003_WriteByte( buffer[count] );
count++;
}
}
}
}
// printf( " \r\n TEST1 \r\n" );
if (res || br == 0) break; /* 出错或者到了MP3文件尾 */
}
printf( " \r\n 播放结束 \r\n" );
/* ------------------- 一曲结束 --------------------*/
count = 0;
/* 根据VS1003的要求,在一曲结束后需发送2048个0来确保下一首的正常播放 */
while ( count < 2048 )
{
if ( DREQ != 0 )
{
for ( j=0; j<32; j++ )
{
VS1003_WriteByte( 0 );
count++;
}
}
}
count = 0;
TXDCS_SET( 1 ); /* 关闭VS1003数据端口 */
f_close(&fsrc); /* 关闭打开的文件 */
}
}
} /* while (f_readdir(&dirs, &finfo) == FR_OK) */
} /* if (f_opendir(&dirs, path) == FR_OK) */
} /* end of MP3_Play */
|
|