[原创]请问如何判断usb设备是否是u盘

我用了贵公司提供的判断打印机的程序,但是发现判断了之后,u盘不能正常写入了。请问我将如何判断呢?

通过接口描述符中的接口类型判断,为0x08则为大容量存储类设备,即U盘


我确实能读到8这个值,但是读了这个值之后,运行CH375FileOpen()函数,程序会跑飞


你用我们的库,那就不需要你去判断设备是不是U盘,库中有子程序会做处理的。关于操作步骤,你可以下载CH375EVT.ZIP,里面有示例程序。


请问是什么子程序?会返回什么样的值?因为我的usb口上可能会是打印机,也可能会是u盘,所以我必须确认


实际操作流程应该是这样的: 首先是设置375的模式为主机模式,然后获取设备描述符和配置描述符,在配置描述符里面的接口描述符里面接口类型判断,为0x08则为大容量存储类设备,即U盘,如果是0X006的话就是打印机,如果是U盘的话,你直接复位375芯片,在调用我们的库来操作U盘,如果是打印机的话,就直接进行数据的发送就可以了。


好像还是不行呢,下面是我的程序,帮我看看问题出在哪吧! void check_upan() { unsigned char i,CH375IntStatus,status; CH375_WR_CMD_PORT( CMD_RESET_ALL ); // CH375执行硬件复位 set_usb_mode( 6 ); // 设置USB主机模式 delay100ms(); set_usb_mode( 7 ); // 复位USB总线 for ( i=0; i<250; i++ ) { delay2us(); delay2us(); delay2us(); delay2us(); } set_usb_mode( 6 ); // 结束复位 CH375_CMD_PORT = CMD_GET_STATUS; // 获取当前中断状态 //delay2us(); CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; // 操作无意义,用于至少延时2uS CH375IntStatus = CH375_DAT_PORT; // 获取中断状态 if ( CH375IntStatus == USB_INT_DISCONNECT ) // 检测到USB设备断开事件 { SBUF= 0xf3; while(TI==0);TI=0; } else if ( CH375IntStatus == USB_INT_CONNECT ) // 检测到USB设备连接事件 { status=get_descr_ex(); if ( p_cfg_descr->itf_descr.bInterfaceClass==8 ) { SBUF= 0xf1; while(TI==0);TI=0; } //检测到u盘 else {SBUF= 0xf3; while(TI==0);TI=0;} //检测到非u盘 } CH375_WR_CMD_PORT( CMD_RESET_ALL ); // CH375执行硬件复位 set_usb_mode( 6 ); // 设置USB主机模式 delay100ms(); set_usb_mode( 7 ); // 复位USB总线 for ( i=0; i<250; i++ ) { delay2us(); delay2us(); delay2us(); delay2us(); } set_usb_mode( 6 ); // 结束复位 i = CH375LibInit( ); // 初始化CH375程序库和CH375芯片,操作成功返回0 mStopIfError( i ); }


这边应该这样来进行操作: status=get_descr_ex(); if ( p_cfg_descr->itf_descr.bInterfaceClass==8 ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); // CH375执行硬件复位 delay100ms();//一定需要延时 i = CH375LibInit( );

} //检测到u盘 else {SBUF= 0xf3; while(TI==0);TI=0; sent_data();//打印机发送数据 } //检测到非u盘 }


还是不行啊!我加了三倍延时都不行!为什么打印机可以直接发送数据,U盘就不行呢?


按照上面的操作的话,在复位之后,需要延时50MS以上,然后在进行对库的初始化,你现在判断出375的库初始化CH375LibInit( )返回的值是多少?在你初始化完成之后,需要在检测设备连接,你可以把你详细的程序贴出来看下


返回值是0


前面的程序是向数组FILE_DATA_BUF中写入文件内容。 /* 开始操作U盘 */ /*新建或打开文件夹*/ mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/UV1700" ); /* 目录名,该目录建在根目录下 */ i = CreateDirectory( ); /* 新建或者打开目录 */ mStopIfError( i ); i = CH375FileClose( ); /* 关闭文件 */ mStopIfError( i );

#ifdef EN_DISK_WRITE /* 子程序库支持写操作 */ /* 产生新文件 */ /* 写操作 */ CH375vFileSize = FILE_SIZE; SecCount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 */ NewSize = (unsigned int)CH375vFileSize; /* 原文件的长度 */ mCopyStringToIRAM2( mCmdParam.Open.mPathName, FILE_DIR_NAME, FILE_DIR_NAME_LONG); i = CH375FileCreate( ); /* 新建文件并打开,如果文件已经存在则先删除后再新建 */ mStopIfError( i ); mCmdParam.Write.mSectorCount = SecCount; /* 写入所有扇区的数据 */ i = CH375FileWrite( ); /* 向文件写入数据 */ mStopIfError( i ); mCmdParam.Modify.mFileAttr = 0xff; /* 输入参数: 新的文件属性,为0FFH则不修改 */ mCmdParam.Modify.mFileTime = 0xffff; /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2000, 0, 0 ); /* 输入参数: 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */ i = CH375FileModify( ); /* 修改当前文件的信息,修改日期和长度 */ mStopIfError( i ); mCmdParam.Close.mUpdateLen = 0; /* 不要自动计算文件长度,如果自动计算,那么该长度总是512的倍数 */ i = CH375FileClose( ); mStopIfError( i );


程序会在进入到CreateDirectory( ); 后运行到 CH375FileOpen()函数跑飞。但是如果我不去读取描述符,程序就不会跑飞。


那可能是RAM出现了问题,你这样,不进行文件夹的创建,直接打开文件看下可以不可以?


直接打开文件也不行。ram会出现什么问题呢?能具体点说明吗?


我借用了打印机的get_descr_ex( )程序,现在发现这个程序好像不适用于u盘。有什么适用于u盘的程序吗?


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