[求助]51读取U盘的程序,返回error:14

printf( "Open\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "/LCSOFT.TXT" ); /* 文件名,该文件在C51子目录下 */ i = CH375FileOpen( ); /* 打开文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 没有找到C51子目录,没有找到CH375HFT.C文件 */ /* 列出文件 */ if ( i == ERR_MISS_DIR ) pCodeStr = "/*"; /* C51子目录不存在则列出根目录下的所有文件 */ else pCodeStr = "/LC*"; /* CH375HFT.C文件不存在则列出\C51子目录下的以CH375开头的文件 */ printf( "List file %s\n", pCodeStr ); for ( EnumCount = 0; EnumCount < 10000; EnumCount ++ ) { /* 最多搜索前10000个文件,实际上没有限制 */ i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, pCodeStr ); /* 搜索文件名,*为通配符,适用于所有文件或者子目录 */ mCmdParam.Open.mPathName[ i ] = 0xFF; /* 根据字符串长度将结束符替换为搜索的序号,从0到254,如果是0xFF即255则说明搜索序号在CH375vFileSize变量中 */ CH375vFileSize = EnumCount; /* 指定搜索/枚举的序号 */ i = CH375FileOpen( ); if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */ if ( i == ERR_FOUND_NAME ) { /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */ printf( " match file %04d#: %s\n", (unsigned int)EnumCount, mCmdParam.Open.mPathName ); /* 显示序号和搜索到的匹配文件名或者子目录名 */ continue; /* 继续搜索下一个匹配的文件名,下次搜索时序号会加1 */ } else { /* 出错 */ mStopIfError( i ); break; } } } else { /* 找到文件或者出错 */ mStopIfError( i ); TotalCount = CH375vFileSize; /* 准备读取总长度 */ printf( "从文件中读出的前%d个字符是:\n",(UINT16)TotalCount ); while ( TotalCount ) { /* 如果文件比较大,一次读不完,可以再调用CH375ByteRead继续读取,文件指针自动向后移动 */ if ( TotalCount > MAX_BYTE_IO ) c = MAX_BYTE_IO; /* 剩余数据较多,限制单次读写的长度不能超过 sizeof( mCmdParam.ByteRead.mByteBuffer ) */ else c = TotalCount; /* 最后剩余的字节数 */ mCmdParam.ByteRead.mByteCount = c; /* 请求读出几十字节数据 */ i = CH375ByteRead( ); /* 以字节为单位读取数据块,单次读写的长度不能超过MAX_BYTE_IO,第二次调用时接着刚才的向后读 */ mStopIfError( i ); TotalCount -= mCmdParam.ByteRead.mByteCount; /* 计数,减去当前实际已经读出的字符数 */ for ( i=0; i!=mCmdParam.ByteRead.mByteCount; i++ ) printf( "%C", mCmdParam.ByteRead.mByteBuffer[i] ); /* 显示读出的字符 */ if ( mCmdParam.ByteRead.mByteCount < c ) { /* 实际读出的字符数少于要求读出的字符数,说明已经到文件的结尾 */ printf( "\n" ); printf( "文件已经结束\n" ); break; } } printf( "Close\n" ); i = CH375FileClose( ); /* 关闭文件 */ mStopIfError( i ); }

我的结果是显示了open,然后有时有Error:14,有时没有,就停住了,不知道有没有技术或者前辈帮我看下,还有,中秋节快乐!


我把U盘文件全删了,空了,又返回Error:92了


我看了下说error:92是说U盘磁盘分区类型不支持,为什么呢,我的文件系统是FAT32,谢谢了


你用的是什么单片机?需要看下你编译之后的单片机使用的资源,还有就是需要看下你的CH375DISKREADY()这个函数返回的数据是多少?


P89V51,64K flash,1024B RAM。 Program Size: data=91.5 xdata=588 const=0 code=11098。返回00


我试了两个程序,都是在这句话上有问题了 mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/XP.TXT" ); i = CH375FileOpen(); 返回的i貌似不对了,不是ERR_MISS_FILE不是ERR_SUCCESS,应该也不是ERR_MISS_DIR


请问大家,可能是什么情况?谢谢


这种情况需要仔细检查下CH375_INT引脚。因为在中断函数里面使用了中断引脚。


检查了,INT引脚复位时低电平,其他时间高电平,我的第二个程序是这样的 while ( 1 ) {

//------------------------------------------------------------------------------------------- // 查询CH375中断并更新中断状态,等待U盘插入 printf("请插入U盘后复位单片机.."); while ( CH375DiskStatus != DISK_CONNECT ) { DelayCS(20); i = CH375LibInit(); DelayCS(5); xQueryInterrupt(); } printf("\nok\n");

mDelaymS( 200 ); //延时,可选操作,有的USB存储器需要几十毫秒的延时 //------------------------------------------------------------------------------------------- // 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 // 有的U盘总是返回未准备好,不过可以被忽略 for ( i = 0; i < 5; i ++ ) { mDelaymS( 100 ); printf("检查U盘是否准备好.. "); if ( CH375DiskReady() == ERR_SUCCESS ) break; //查询磁盘是否准备好.

} printf("ok\n"); //---------------------------------------------------------------------------------------- // 查询磁盘物理容量 i = CH375DiskSize(); mStopIfError( i ); //显示为以MB为单位的容量 printf("\nU盘容量为:%ld MB\n\n",mCmdParam.DiskSize.mDiskSizeSec/2048); //-------------------------------------------------------------------------------- //如果XP.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 //文件名,该文件在根目录下 mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/XP.TXT" ); i = CH375FileOpen(); // 打开文件 mStopIfError( i ); //文件存在并且已经被打开 if ( i == ERR_SUCCESS ) {

printf("打开文件 XP.TXT\n"); mCmdParam.ByteLocate.mByteOffset = 0; /* 移到文件的首部 */ i = CH375ByteLocate(); mStopIfError( i );

} // 没有找到文件,必须新建文件 else if ( i == ERR_MISS_FILE ) { printf("创建文件 XP.TXT\n"); //文件名,该文件在根目录下,刚才已经提供给CH375FileOpen mCopyCodeStringToXRAM( mCmdParam.Create.mPathName, "/XP.TXT" ); i = CH375FileCreate(); // 新建文件并打开,如果文件已经存在则先删除后再新建 mStopIfError( i ); } // 打开文件时出错 else { mStopIfError( i ); }

//------------------------------- //写操作. printf("正在将数据写入文件.. "); mCmdParam.ByteLocate.mByteOffset = 0xffffffff; /* 移到文件的尾部 */ i = CH375ByteLocate(); mStopIfError( i );


串口打印显示的是 测试开始 请插入U盘后复位单片机........................... ok 检查U盘是否准备好.. ok

U盘容量为:3823 MB 然后就没有了


再次在这句话停了,i = CH375FileOpen(); 这个函数具体怎么实现的呢,还是我买的硬件有问题?因为刚学,什么都不懂,又很容易放弃,只能逼着自己抓紧问你们了,谢谢了


不会发图,只能打了, 硬件连接图是这样的 1 INT# 联到两排端子上 2 RST1 0.47uF接3.3V 3 WR# 联到两排端子上 4 RD# 联到两排端子上 5 TXD 接GND 6 RXD 未接 8 A0 联到两排端子上 9 V3 接10nF到地 10 UD+ 接usb母口的D+ 11 UD- 接usb母口的D- 12 GND 13,14 12M晶振和22pf电容 15-22 联到两排端子上 23 GND 24 ACT#接1K接灯到3.3 25 26空 27 CS# 联到两排端子上 28 3.3V


CH375FileOpen()这个函数的实现在我们库里面,首先你最好监控一下CH375DiskReady() 这个函数的返回值,是否为0才退出,其次中断是怎么处理的?插上U盘INT有没有拉低?有没有进入你的则的函数?


1 首先CH375DiskReady() 这个函数的返回值确定是0, 2 其次中断是怎么处理的?不太明白这个意思,用的库是ch375hfc mCopyCodeStringToXRAM( mCmdParam.Open.mPathName, "/XP.TXT" ); i = CH375FileOpen(); // 打开文件 所以就不知道这句话是怎么进中断的,我感觉是没进去。因为INT#未拉低 3 插上U盘INT有没有拉低?有,确定 4 有没有进入你的则的函数?我的子函数?不太明白你的意思,我感觉现在这样的,插上U盘后INT拉低了,但是在CH375FileOpen();这句话时应该进中断是吗?但是没进,X宝买的模块,我也不确定是否硬件有问题


前面初始化正常通过,应该硬件没什么问题。感觉还是你的RAM的问题,导致进入CH375FileOpen(),程序跑飞了,没有等到中断。


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