zhaoaimin
驱动牛犊
驱动牛犊
  • 注册日期2003-11-10
  • 最后登录2003-11-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1640回复:5

请问为什么USB设备枚举不出来,各位大侠帮帮忙吧

楼主#
更多 发布于:2003-11-10 17:54
    我现在做一个项目,开发软件实现两台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。

 请大侠赐教,我在上海,交个朋友吧

最新喜欢:

lmhhlmhhlmhhlm...
jiyu75
禁止发言
禁止发言
  • 注册日期2002-12-17
  • 最后登录2018-07-10
  • 粉丝0
  • 关注1
  • 积分-388分
  • 威望1181点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-11-13 11:52
用户被禁言,该主题自动屏蔽!
gaohtao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-20
  • 最后登录2004-01-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-11 14:58
我刚刚把VC6 的程序移植到CB5中了,个人觉得CB5开发界面好一点。就这么多费了一些事。我的程序已经在CB5中编译连接通过,完全可以检测我自己的HID设备,完成读写多字节数据。
pandengzhe
驱动中牛
驱动中牛
  • 注册日期2003-01-17
  • 最后登录2005-04-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-11 14:19
楼上用的是:c++builder?
大风卷兮,林木为摧,意苦若死,招憩不来。 百岁如流,富贵冷灰,大道日往,苦为雄才。 壮士拂剑,浩然弥哀,萧萧落叶,漏雨苍苔。
gaohtao
驱动牛犊
驱动牛犊
  • 注册日期2003-10-20
  • 最后登录2004-01-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
}


tomjin
驱动牛犊
驱动牛犊
  • 注册日期2002-12-16
  • 最后登录2006-03-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-10 18:52
弱弱的问:你所说的BAFO BF-100C FILE TRANSFER DATA CABLE是什么东东?如果你是实现2台pc机之间的通讯,是不能简单的把2台机子连在一起的。usb通讯存在主从关系!
游客

返回顶部