CH376主机模式(用单片机控制)打开文件的时候 返回02[求助]

如题 在初始化配置成功和 U盘检测成功的情况下,打开文件时返回 02 这是什么情况

U盘检测成功之后 有没有对U盘进行初始化操作,也就是发送CMD0H_DISK_MOUNT命令


发送了 发送完这个命令都返回成功了 也就是函数s = CH376DiskMount( );结果是成功的 USB_INT_SUCCESS


0x02表示磁盘没有被初始化,也就是 CH376DiskMount()可能没有通过,返回的USB_INT_SUCCESS也可能是上次的结果,如果CH376DiskMount()成功了 那么你可以尝试读一下磁盘的信息。 i = CH376ReadBlock( buf ); /* 如果需要,可以读取数据CH376_CMD_DATA.DiskMountInq,返回长度 */ if ( i == sizeof( INQUIRY_DATA ) ) { /* U盘的厂商和产品信息 */ buf[ i ] = 0; printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); } }


我就是用官方的程序,你说的这个也加上了,但是没有成功读出


我可以确定是 CH376DiskMount() 通过并返回成功了,因为我专门在执行CH376DiskMount() 前吧s清零了,但是还是打不开文件? 奇怪的是 我用 57600 波特率的时候立即返回 02 用9600和 19200波特率的时候过了好一会返回 FA 头文件 和PDF上给的 错误代码里面并没有FA

在去掉以下这段程序之后不管波特率设置的多少 打开文件 都会返回 03h

那么这种问题改如何解决,我已经格式化U盘为FAT格式或者FAT32格式试过了

i = CH376ReadBlock( buf ); /* 如果需要,可以读取数据CH376_CMD_DATA.DiskMountInq,返回长度 */ if ( i == sizeof( INQUIRY_DATA ) ) { /* U盘的厂商和产品信息 */ buf[ i ] = 0; printf( "UdiskInfo: %s\n", ((P_INQUIRY_DATA)buf) -> VendorIdStr ); } }

在同时去掉上面和以下程序后可以正常打开根目录的文件 ,但是读不出来里面的数据(前200个字符只显示两个0d 0a 0d 0a) 但是 此时可以在根目录下 成功建立新的文件

打开多级目录里面的数据时候会返回 43h if ( CH376GetDiskStatus( ) < DEF_DISK_MOUNTED ) { /* 未知USB设备,例如USB键盘、打印机等 */ printf( "Unknown device\n" ); goto UnknownUsbDevice; } 经过我的实验,在波特率设置不对的时候会返回FA 在头文件里看到 磁盘初始化不成功的 代码是02h 打开文件的代码是 43h 磁盘已经初始化成功,但是尚未分析文件系统或者文件系统不支持 的代码是 03d

但是没找到 fah的

这些情况都是怎么回事 ?现在搞得我一塌糊涂,希望能指点迷津

还有一句 我的ch376 是ch376T


我用的是 单片机用异步串口的方式来和 ch376 通讯


还有一句 我的ch376 是ch376T


希望早点有人回复啊 谢谢


0xFA 不是CH376返回给你的,是程序中返回,程序中只有两个地方可以返回0xFA,一个是串口接收数据超时,还有一个是等待中断超时, 你这种好像是查询中断的函数有问题,参考下面的程序修改一下

/* 查询CH376中断(INT#低电平) */ UINT8 Query376Interrupt( void ) { #ifdef CH376_INT_WIRE if(RI==1) //串口接收标志,串口接收到数据 RI=0; //清串口标志 return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ #else if ( RI ) ////串口接收标志,串口接收到数据 { RI = 0; //清串口标志 return( TRUE ); } else return( FALSE ); #endif }


嗯修改后前面的问题解决了 i = CH376ReadBlock( buf ); 这个函数返回的i是 14h ( 应该是1D) strcpy( buf, "\\C51\\CH376HFT.C" ); s = CH376FileOpenPath( buf ); 这个函数返回的s是1D (应该是 14)

这又是为什么啊 ------------------


按这样修改后可以打开 但是打开后 s = CH376ByteRead( buf, i, &RealCount ); 这个函数没有扫描到中断,返回的是FA 如果屏蔽掉检测错误的程序,buf里面的数据会打印到电脑上,而且是被打开文件里读出来的 (但是检查U盘连接和磁盘初始化甚至打开文件 的时候都是可以正常等待到中断的) 此时buf里面显示的数据是打开文件里面读出来的,但是个数不对 比如你要 200个,他只能读出来28个 你要12个,他读出来40个 你要14个,他读出来42个 你要15个,他读出来43个

这是怎么回事啊


1.前面的问题有没有解决? 2. CH376ByteRead()函数是自己写的? 还是使用网站上提供的程序。 3. 有没有测试过字节写方式。


前面的问题都解决了,现在就是11楼的问题(读的方式是复制 host.c里面的)

CH376ByteRead() 和 CH376ByteWrite() 函数都是网站上提供的

新建一个文件可以写进去,已有的文件追加也可以成功,不过最后一行写的是“今天的ADC数据到此结束”存到U盘上变成了“今天的ADC示莸酱私崾?”


那说明你写数据的时候写错了,你先监视一下你写进去的数据长度和数据缓冲区的内容是否正确。


建议你不要使用strcpy这个函数来复制数据,在KEIL下使用这个函数是会出现错误的,你可以直接往你的缓冲区里面写数据,然后看下写的数据是否正确。


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