[原创]USB键盘读不出键值??求助~!!

Reset Device Start Low-Speed Device GetDeviceDescr: device_status=14 12 01 10 01 00 00 00 08 8F 0E 22 00 10 02 01 02 00 01 address_status=14 09 02 3b 00 09 02 3B 00 02 01 00 A0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 3E 00 07 05 81 03 08 00 0A 09 04 01 00 01 03 00 00 01 09 21 10 01 00 01 22 47 00 07 05 82 03 03 00 0A hid_des_leng=47 endp_in_addr=00 endp_out_addr=08 config_status=14 SetUsbConfig_success Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 26 ff 00 05 07 19 00 29 91 81 00 c0 00 00 00 00 00 00 f9 ff ff Set_Report Set_Report success s:2a s:2a s:2a s:2a s:2a s:2a s:2a 以上是我串口的调试信息; 以下是我的代码 请高人指点啊 HostSetBusFree( ); // 设定USB主机空闲 while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) ) break; // 有USB设备 } mDelaymS( 250 ); // 由于USB设备刚插入尚未稳定,故等待USB设备数百毫秒,消除插拔抖动 if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理

printf( "Reset Device\n" ); HostSetBusReset( ); // USB总线复位 for ( i = 0; i < 100; i ++ ) // 等待USB设备复位后重新连接 { if ( Query374DeviceIn( ) ) break; // 有USB设备 mDelaymS( 1 ); } if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) ) // 有USB设备 { if ( Query374DevFullSpeed( ) ) { printf( "Start Full-Speed Device\n" ); HostSetFullSpeed( ); // 检测到全速USB设备 } else { printf( "Start Low-Speed Device\n" ); HostSetLowSpeed( ); // 检测到低速USB设备 LOW_SPEED_BIT=1; } } else { continue; // 设备已经断开,继续等待 } mDelaymS( 50 ); close_bit_flag=0; printf( "GetDeviceDescr: " ); s = GetDeviceDescr( buf ); // 获取设备描述符 printf("device_status=%02x \n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 终止操作,等待USB设备拔出 } for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ ) printf( "%02X ", (UINT16)( buf[i] ) ); printf( "\n" ); s = SetUsbAddress( 0x09 ); // 设置USB设备地址 printf("address_status=%02x\n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 终止操作,等待USB设备拔出 } s = GetConfigDescr( buf ); // 获取配置描述符 printf("config_status=%02x\n",(unsigned short)s); if ( s != USB_INT_SUCCESS ) { goto WaitDeviceOut; // 终止操作,等待USB设备拔出 }

// 分析配置描述符,获取端点数据/各端点地址/各端点大小等,更新变量endp_addr和endp_size等 s = SetUsbConfig( ( (PUSB_CFG_DESCR)buf ) -> bConfigurationValue ); // 设置USB设备配置 if ( s != USB_INT_SUCCESS ) { // printf( "ERROR = %02X\n", (UINT16)s ); goto WaitDeviceOut; // 终止操作,等待USB设备拔出 } else printf( "SetUsbConfig_success\n" );

//-------------------------以下进行HID类的简单操作----------------------------------------------------------- printf("Set_Idle\n"); s=Set_Idle( ); //设置IDLE,这个步骤是按照HID类的协议来做的 if(s!=USB_INT_SUCCESS) { printf("Set_Idle_Err=%02x\n",(unsigned short)s); if(s&0x0f==USB_INT_RET_STALL) goto next_operate1; //返回STALL可能本身不支持 } else printf("Set_idle success\n"); next_operate1: printf("Get_Hid_Des\n"); s=Get_Hid_Des(buf); // 获取报表描述符描述符 if(s==USB_INT_SUCCESS) { printf("HID_Desc: "); for(i=0;i!=hid_des_leng;i++) printf("%02x ",(unsigned short)buf[i]); printf("\n"); } else { goto WaitDeviceOut; //出错退出 }

printf("Set_Report \n"); //对于键盘发Set_Report来点亮灯,对于鼠标则不需要这一步 buf[0]=0x01; //buf[0]=LED_SCRL*4+LED_CAPS*2+LED_NUM; s=Set_Report(buf); //设置报表 if(s==USB_INT_SUCCESS) { printf("Set_Report success\n"); } else { printf("Set_Report Err=%02x\n",(unsigned short)s); //设置报告出错 if(s&0x0f==USB_INT_RET_STALL) goto next_operate2; //返回STALL可能本身不支持 } next_operate2:

// 下面开始读取数据 ( 实际在读取数据的时候,要先发送中断端点的令牌来读取数据,接着才能获取到数据 ) tog1=FALSE; //开始取DATA0 while(1) { s=Interrupt_Data_Trans(buf); printf("s:%x \n",(unsigned short)s); // for(i=0;i!=8;i++) printf("%02x ",(unsigned short)buf[i]); // printf("\n"); if(s==0x2a)//if(s==USB_INT_SUCCESS) { for(i=0;i!=8;i++) printf("%02x ",(unsigned short)buf[i]); printf("\n"); } else if(s==USB_INT_DISCONNECT) // 这个是为了知道设备拔出产生的中断状态 { close_bit_flag=1; break; } } WaitDeviceOut: // 等待USB设备拔出 printf( "Wait Device Out\n" ); if(close_bit_flag==0){ while ( 1 ) { if ( Query374Interrupt( ) ) HostDetectInterrupt( ); // 如果有USB主机中断则处理 if ( Query374DeviceIn( ) == FALSE ) break; // 没有USB设备 } } mDelaymS( 100 ); // 等待设备完全断开,消除插拔抖动

人都干什么去了 没有人么 还是我的问题 太简单了 无人问津呢


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