阅读:1640回复:5
请问为什么USB设备枚举不出来,各位大侠帮帮忙吧
我现在做一个项目,开发软件实现两台PC之间通过USB实现数据传输,使用BAFO BF-100C FILE TRANSFER DATA CABLE,
平台为WIN2000,当我在PC上已经插上U盘和电缆后,用微软DDK2000里带的一个工具:usbview.exe可以发现设备和驱动, 但是我用下面C程序枚举设备时却返回没有任何设备, hardwareDeviceInfo = SetupDiGetClassDevs ( pGuid, // 已经在usbview.exe里看到的类GUID NULL, // Define no enumerator (global) NULL, // Define no // (DIGCF_PRESENT | // Only Devices present // DIGCF_INTERFACEDEVICE) DIGCF_ALLCLASSES ); // Function class devices. // 枚举接口 if (SetupDiEnumDeviceInterfaces (hardwareDeviceInfo, 0, // We don\'t care about specific PDOs pGuid, i, &deviceInfoData)) { hOut = OpenOneDevice (hardwareDeviceInfo, &deviceInfoData, outNameBuf); if ( hOut != INVALID_HANDLE_VALUE ) { done = TRUE; break; } } else { if (ERROR_NO_MORE_ITEMS == GetLastError()) { done = TRUE; break; // 流程在在这返回 } } 这段程序是DDK2000自带的HID的应用程序,用来操作HID DRIVER。 请大侠赐教,我在上海,交个朋友吧 |
|
最新喜欢:![]() |
沙发#
发布于:2003-11-13 11:52
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2003-11-11 14:58
我刚刚把VC6 的程序移植到CB5中了,个人觉得CB5开发界面好一点。就这么多费了一些事。我的程序已经在CB5中编译连接通过,完全可以检测我自己的HID设备,完成读写多字节数据。
|
|
地板#
发布于:2003-11-11 14:19
楼上用的是:c++builder?
|
|
|
地下室#
发布于:2003-11-11 09:21
贴一段我的程序,是用来检查识别并打开指定的HID设备。注意:一定要是HID类的USB设备才会被发现,否则找不到设备。
//定义HID类USB操作所用到的全局变量 GUID HidGuid; //HID类别的识别符。 HANDLE hDevInfo; //含有HID信息的结构数组。 HANDLE DeviceHandle; //检验VendorID和ProductID时所用的句柄。 HANDLE ReadHandle; //读数据所用的句柄。 HANDLE WriteHandle; //写数据所用的句柄。 char InputReport[3]; //读数据时所用的数据输入数组。 char OutputReport[3]; //写数据时所用的数据输出数组。 DWORD ActualBytesRead; //实际读取的字节数。 DWORD BytesRead; //希望读取的字节数。 bool DeviceDetected; //检验到指定HID设备标记。 bool ApplicationActive; // ULONG Length; //各种数据结构大小的标记量。 ULONG Required; //HID函数调用中使用的参量。 HIDP_CAPS Capabilities; //设备能力信息的数据结构, //包含报告描述符的主要内容。 const unsigned int VendorID = 0x0925; //USB设备生产厂商ID代号 const unsigned int ProductID = 0x1234; //USB设备产品代号 bool FindTheHID() { //************************************************************************* //* FindTheHID(): //* 寻找指定的HID设备,找到后打开设备,返回设备句柄以及能力信息等全局变量。 //* 使用打开的句柄读写设备数据,如果异常必须关闭该句柄。 //************************************************************************* //定义所用到的局部变量,对于指针变量必须释放. HIDD_ATTRIBUTES Attributes; PSP_DEVICE_INTERFACE_DETAIL_DATA detailData; SP_DEVICE_INTERFACE_DATA devInfoData; bool LastDevice = FALSE; bool MyDeviceDetected = FALSE; bool Success = false; int MemberIndex = 0; LONG Result; // 以下为临时变量 HINSTANCE ins; FARPROC proc; int xxx; char * yyy; AnsiString str; //保存各种需要显示的字符串信息。 ins=LoadLibrary(\"Hid.dll\"); if (ins == NULL) throw \"Can\'t Load Library!\"; proc = GetProcAddress(ins,\"HidD_GetHidGuid\"); if (proc==NULL) { str=\"在 xhid.lib 中没有找到HidD_GetHidGuid 函数!失败\"; FreeLibrary(ins); throw \"Can\'t Get Proc Address!\"; } else { str=\"在 xhid.lib 中找到HidD_GetHidGuid 函数!成功\"; } Form1->Memo1->Lines->Add(str); if(!FreeLibrary(ins)) throw \"Can\'t Free!\"; yyy=HidGuid.Data4; str=\"HidGuid:\"+IntToStr(HidGuid.Data1)+\"-\"+IntToStr(HidGuid.Data2) +\"-\"+IntToStr(HidGuid.Data3)+\"-\"+AnsiString(yyy); delete yyy; Form1->Memo1->Lines->Add(str); Form1->Memo1->Lines->Add(\"执行函数HidD_GetHidGuid( &HidGuid )...\"); Form1->Memo1->Lines->Add(\"取得HID类别的GUID。\"); HidD_GetHidGuid( &HidGuid ); Form1->Memo1->Lines->Add(\"执行函数HidD_GetHidGuid( &HidGuid )完成!\"); str=\"HidGuid:\"+IntToStr(HidGuid.Data1)+\"-\"+IntToStr(HidGuid.Data2) +\"-\"+IntToStr(HidGuid.Data3)+\"-\"+AnsiString(yyy); Form1->Memo1->Lines->Add(str); Form1->Memo1->Lines->Add(\"执行函数SetupDiGetClassDevs(...)...\"); Form1->Memo1->Lines->Add(\"取得HID信息的结构数组。\"); hDevInfo=SetupDiGetClassDevs \\ (&HidGuid, \\ NULL, \\ NULL, \\ DIGCF_PRESENT|DIGCF_INTERFACEDEVICE); Form1->Memo1->Lines->Add(\"执行函数SetupDiGetClassDevs(...)完成!\"); xxx=devInfoData.cbSize = sizeof(devInfoData); str=\"devInfoData.cbSize:\"+ IntToStr(xxx); Form1->Memo1->Lines->Add(str); MemberIndex = 0; LastDevice = FALSE; do { MyDeviceDetected=FALSE; Form1->Memo1->Lines->Add(\"执行函数SetupDiEnumDeviceInterfaces(...)...\"); str= \"识别HID接口。MemberIndex:\"+ IntToStr(MemberIndex) ; Form1->Memo1->Lines->Add(str); Result=SetupDiEnumDeviceInterfaces \\ (hDevInfo, \\ 0, \\ &HidGuid, \\ MemberIndex, \\ &devInfoData); Form1->Memo1->Lines->Add(\"执行函数SetupDiEnumDeviceInterfaces(...)完成!\"); if (Result != 0) { Form1->Memo1->Lines->Add(\"循环执行函数SetupDiGetDeviceInterfaceDetail(...)...\"); Result = SetupDiGetDeviceInterfaceDetail \\ (hDevInfo, \\ &devInfoData, \\ NULL, \\ 0, \\ &Length, \\ NULL); str= \"取得设备的路径信息。第一次执行传回DeviceInterfaceDataSize:\" +IntToStr(Length); Form1->Memo1->Lines->Add(str); detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length); detailData -> cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); Result = SetupDiGetDeviceInterfaceDetail \\ (hDevInfo, \\ &devInfoData, \\ detailData, \\ Length, \\ &Required, \\ NULL); str= \"取得设备的路径信息。第二次执行传回detailData->DevicePath:\"; Form1->Memo1->Lines->Add(str); Form1->Memo1->Lines->Add(\"循环执行函数SetupDiGetDeviceInterfaceDetail(...)完成!\"); Form1->Memo1->Lines->Add(\"执行函数CreateFile(...)...\"); Form1->Memo1->Lines->Add(\"开启一个HID设备,取得设备的代号.\"); DeviceHandle=CreateFile \\ (detailData->DevicePath, \\ GENERIC_READ|GENERIC_WRITE, \\ FILE_SHARE_READ|FILE_SHARE_WRITE, \\ NULL, \\ OPEN_EXISTING, \\ 0, \\ NULL); Form1->Memo1->Lines->Add(\"执行函数CreateFile(...)完成!\"); Attributes.Size = sizeof(Attributes); Form1->Memo1->Lines->Add(\"执行函数HidD_GetAttributes(...)...\"); Form1->Memo1->Lines->Add(\"取得设备的厂商和产品ID代号.\"); Result = HidD_GetAttributes \\ (DeviceHandle, \\ &Attributes); str=\"VendorID:\"+IntToStr(Attributes.VendorID) + \" ProductID:\"+IntToStr(Attributes.ProductID ); Form1->Memo1->Lines->Add (str); Form1->Memo1->Lines->Add(\"执行函数HidD_GetAttributes(...)完成!\"); //Is it the desired device? MyDeviceDetected = FALSE; //Both the Product and Vendor IDs match. if ( (Attributes.VendorID == VendorID) && (Attributes.ProductID == ProductID) ) { Success=true; MyDeviceDetected = TRUE; Form1->Memo1->Lines->Add (\"发现指定的设备!\"); //Get the device\'s capablities. Form1->Memo1->Lines->Add(\"*******************************************\"); Form1->Memo1->Lines->Add(\"执行自定义函数GetDeviceCapabilities()...\"); Form1->Memo1->Lines->Add(\"取得设备的能力.\"); GetDeviceCapabilities(); Form1->Memo1->Lines->Add(\"执行自定义函数GetDeviceCapabilities()完成!\"); Form1->Memo1->Lines->Add(\"*******************************************\"); //Use this handle for writing reports. ReadHandle=WriteHandle=DeviceHandle; //Read a report from the device. Form1->Memo1->Lines->Add(\"执行自定义函数ReadReport()...\"); Form1->Memo1->Lines->Add(\"读取设备发送到主机的数据.\"); ////// ReadReport(); Form1->Memo1->Lines->Add(\"执行自定义函数ReadReport()完成!\"); DisplayInputData(); //if (Attributes.ProductID == ProductID) // && (Attributes.VendorID == VendorID) } else //The Vendor ID && ProductID doesn\'t match. CloseHandle(DeviceHandle); //Free the memory used by the detailData structure (no longer needed). free(detailData); } //if (Result != 0) else { Form1->Memo1->Lines->Add(\"所有的HID接口设备识别完毕!\"); //SetupDiEnumDeviceInterfaces returned 0, so there are no more devices to check. LastDevice=TRUE; } //If we haven\'t found the device yet, and haven\'t tried every available device, //try the next one. MemberIndex = MemberIndex + 1; } //do while ((LastDevice == FALSE) && (MyDeviceDetected == FALSE)); //释放不再使用的指针hDevInfo SetupDiDestroyDeviceInfoList(hDevInfo); return Success; } |
|
5楼#
发布于:2003-11-10 18:52
弱弱的问:你所说的BAFO BF-100C FILE TRANSFER DATA CABLE是什么东东?如果你是实现2台pc机之间的通讯,是不能简单的把2台机子连在一起的。usb通讯存在主从关系!
|
|