问题

我最近在做CH375,现在有点问题想请教你一下。执行到CH375DiskQuery()程序就走不过去了,不知为什么 没有开辟文件缓冲区。只有磁盘缓冲区 磁盘缓冲区好像只能读,不能写,写的时候用的是DISK_BASE_BUF=i直接复制的,写的时候也会死掉 单片机是STC90C516RD+

建议你去查下使用库之后,编译之后RAM空间是什么分配的?有没有超出单片机的RAM空间。


那说明可能你是RAM溢出了。你看一下编译好后,占用了多少RAM。


可以了!谢谢 还有就是读出的文件为什么回事乱码,TXT是正常,读DOC文件会出现乱码?


TXT文件是ASCII码。 DOC文档是什么内容你要自己查看一下DOC的具体说明


读取文件数据时会一直发送到串口好像死循环问题出在 for(i=0;i{ printf("%c",DISK_BASE_BUF[i]); //停止在这里 }

代码: while(1) { mCmdParam.ReadX.mDataBuffer=DISK_BASE_BUF; mCmdParam.ReadX.mSectorCount=SecCount; if(CH375vFileSize%CH375vSectorSize!=0) CH375vFileSize += CH375vSectorSize - 1; Status=CH375FileReadX(); if(CH375vFileSize%CH375vSectorSize!=0)CH375vFileSize -= CH375vSectorSize - 1; mStopIfError( Status ); if(mCmdParam.ReadX.mSectorCount { break; } printf("NewSize=%u \n",(unsigned int)NewSize); for(i=0;i { printf("%c",DISK_BASE_BUF[i]); } }


CH375vFileSize这个变量不要这样递减。 这样是错误的。 库里面会调用这个变量的。你在外面只能查询这个变量,否则读出的文件就会变少了。 while(1) { mCmdParam.ReadX.mSectorCount=SecCount; Status=CH375FileReadX(); mStopIfError( Status ); if(mCmdParam.ReadX.mSectorCount{ break; }

} 这样做就能把文件读完了。你的操作是错误的。 至于死机,你检查一下i 和NewSize的变量类型。看看是不是变量有问题


CH375 检查出的 CH375vFileSize为420,这是指字符数吧?而我在电脑上查看字符数只有300多。 好友就是如果把那个For循环中的NewSize改成一个小点的数就可以可,不知是不是printf问题,还是读取的CH375vFileSize不正确


这个你自己检查一下应该很简单


解决了,是数据类型问题


估计i是8位的。


我参照例程,UINT8 ListAll( ) /* 以广度优先的算法枚举整个U盘中的所有文件及目录 */ { UINT8 i; UINT16 OldFileCount; OldFileCount = FileCount = 0; /* 清文件结构计数 */ FileNameBuffer[ 0 ].Name[0] = '/'; /* 根目录,是完整路径名,除根目录是绝对路径之外都是相对路径 */ FileNameBuffer[ 0 ].Name[1] = 0; FileNameBuffer[ 0 ].DirStartClust = 0; /* 根目录的这个参数无意义 */ FileNameBuffer[ 0 ].Attr = ATTR_DIRECTORY; /* 根目录也是目录,作为第一个记录保存 */ for ( FileCount = 1; OldFileCount < FileCount; OldFileCount ++ ) { /* 尚有新枚举到的文件名结构未进行分析 */ if ( FileNameBuffer[ OldFileCount ].Attr & ATTR_DIRECTORY ) { /* 是目录则继续进行深度搜索 */ strcpy( mCmdParam.Open.mPathName, FileNameBuffer[ OldFileCount ].Name ); /* 目录名,除根目录外都是相对路径 */ CH375vStartCluster = FileNameBuffer[ OldFileCount ].DirStartClust; /* 当前目录的上级目录的起始簇号,便于用相对路径打开,比完整路径名速度快 */ i = CH375FileOpen( ); /* 打开目录,仅为了获取目录的起始簇号以提高速度 */ if ( i == ERR_SUCCESS ) return( ERR_MISS_DIR ); /* 应该是打开了目录,但是返回结果是打开了文件 */ if ( i != ERR_OPEN_DIR ) return( i ); if ( OldFileCount ) CurrentDirStartClust = CH375vStartCluster; /* 不是根目录,获取目录的起始簇号 */ else { /* 是根目录,获取根目录的起始簇号 */ if ( CH375vDiskFat == DISK_FAT32 ) CurrentDirStartClust = CH375vDiskRoot; /* FAT32根目录 */ else CurrentDirStartClust = 0; /* FAT12/FAT16根目录 */ } CH375FileClose( ); /* 对于根目录一定要关闭 */

// strcpy( mCmdParam.Open.mPathName, FileNameBuffer[ OldFileCount ].Name ); /* 目录名,由于mPathName未被修改所以无需再复制 */ CH375vStartCluster = FileNameBuffer[ OldFileCount ].DirStartClust; /* 当前目录的上级目录的起始簇号,便于用相对路径打开,比完整路径名速度快 */ i = ListFile( ); /* 枚举目录,由回调程序xFileNameEnumer产生记录保存到结构中 */ if ( i != ERR_SUCCESS ) return( i ); } } }

我在主函数里调用这个函数枚举说有文件,运行后CH375好像一直不断重启


写这个函数时增加了 typedef struct _FILE_NAME { UINT32 DirStartClust;/* 文件所在目录的起始簇号 */ UINT8 Name[8+1+3+1];/* 文件名,共8+3字节,分隔符,结束符,因为未包含上级目录名所以是相对路径 */ UINT8 Attr; /* 文件属性 */ } FILE_NAME; #define MAX_FILE_COUNT 40 FILE_NAME xdata FileNameBuffer[ MAX_FILE_COUNT ]; /* 文件名结构 */ UINT16 FileCount; UINT32 CurrentDirStartClust; /* 保存当前目录的起始簇号,用于加快文件枚举和打开速度 */


有没有什么其他方法枚举所有文件包括子目录下的 我使用递归,还是有问题,单片机好像执行到ListAll就复位 void ListAll( UINT8 PathName[30]) reentrant /*以广度优先的算法枚举整个U盘中的所有文件及目录 */ { UINT32 l; UINT8 i ; UINT8 Status,len; for(l=0;l<2000;l++) { // len= mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "\\*"); // /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ // mCmdParam.Open.mPathName[len] = 0xFF; // /* 根据字符串长度将结束符替换为搜索的序号,从0到254, // 如果是0xFF即255则说明搜索序号在CH375vFileSize变量中 */ // CH375vFileSize = i; /* 指定搜索/枚举的序号 */ strcpy(mCmdParam.Enumer.mPathName,PathName); len=strlen(mCmdParam.Enumer.mPathName); mCmdParam.Enumer.mPathName[len]=0xFF ; CH375vFileSize = l; Status=CH375FileEnumer( ); if(Status==ERR_MISS_FILE) { printf("找不到匹配项:\n"); break; } if(Status!=ERR_SUCCESS) { printf("枚举失败:\n"); mStopIfError( Status ); } /* 搜索到相匹配的文件名,显示序号和搜索到的匹配文件名或者子目录名 */ if ( CH375vFileSize!=0xFFFFFFFF ) /* 枚举到文件 */ { i = strlen( mCmdParam.Open.mPathName ); if( mCmdParam.Open.mPathName[ i - 1 ] == 'T' && mCmdParam.Open.mPathName[ i - 2 ] == 'X' && mCmdParam.Open.mPathName[ i - 3 ] == 'T'&& mCmdParam.Open.mPathName[ i - 4 ] == '.' ) { printf("%d#-->name: %s \n",(unsigned int )l,mCmdParam.Open.mPathName); //play(); } } else { printf( " --this is a directory\n" ); /* 枚举到子目录 */ ListAll(mCmdParam.Open.mPathName) ; }

} }


递归不行,会出问题,有没有什么其他方法枚举所有文件包括子目录下的


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