小弟我手头上一个项目,需要对usb设备进行操作,但是碰到了有这么几个问题,想请各位来帮忙指点.先谢谢了.环境:windows xp ,两个使用相同芯片的usb设备(暂命名为A,B),这两个设备的固件版本号不同,
     使用同一个驱动,芯片是c8051f340,驱动程序是使用厂商发布的。
     应用软件可以根据固件版本号的不同去区分使用哪个usb设备。问题一:分别在四台机器上测试停用启用usb设备的代码,硬件环境均一致,但是效果不一样。其中有三台机器能成功的停用,启用A Usb 设备,有一台机器能停用A Usb设备,但是停用后,不能再成功启用该A Usb设备,但是该台机器能够成功的停用和启用
B Usb 设备. 而且另外三台则只能停用B Usb 设备,不能成功启动之.从代码运行的返回值来看,运行启动usb设备的结果是成功的,但是从windows系统的设备管理器查看,对应的usb设备还是处于停用的状态。
相对应的代码如下://启用usb设备,和设备管理器里面的启用相同
BOOL Start_Usb_Device(void)
{
    BOOL bRet = FALSE;
    m_GUID=GUID_INTERFACE_CYGNAL_BULK;
    
    // Retrieve device list for GUID that has been specified.
    HDEVINFO hDevInfoList = SetupDiGetClassDevs (&m_GUID, NULL, NULL, DIGCF_DEVICEINTERFACE); 
    if (hDevInfoList != NULL)
    {
       SP_DEVINFO_DATA deviceInfoData={sizeof(SP_DEVINFO_DATA)};
       
        for(DWORD i=0; SetupDiEnumDeviceInfo(hDevInfoList,i,&deviceInfoData);i++)
        {
            char buffer[1024];
            int bufferSize=1024;
            
            if (SetupDiGetDeviceRegistryProperty(hDevInfoList,
                &deviceInfoData,
                SPDRP_HARDWAREID,
                NULL,
                (PBYTE)buffer,
                bufferSize,
                NULL))
            {
                //判断是A设备还是B设备
                if (buffer[26]==0x33 && buffer[27]==0x33 && buffer[28]==0x33 && buffer[29]==0x33)
                {
                    bRet=Change_Usb_Device(DICS_ENABLE,&deviceInfoData,hDevInfoList);
                    break;
                }
   }
            
        }
        
           }
    
    SetupDiDestroyDeviceInfoList (hDevInfoList);
    
return bRet;
    
}//改变USB设备的状态
BOOL Change_Usb_Device(DWORD dwNewState,SP_DEVINFO_DATA *pDevData,HDEVINFO hDEVINFO)
{
    SP_PROPCHANGE_PARAMS PropChangeParams;
    SP_DEVINFO_DATA      DevInfoData={sizeof(SP_DEVINFO_DATA)};
    SP_DEVINSTALL_PARAMS devParams;    PropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);
    PropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;
    PropChangeParams.Scope=DICS_FLAG_GLOBAL;
    PropChangeParams.StateChange=dwNewState;
    PropChangeParams.HwProfile=0;    //改变设备属性
    if(!SetupDiSetClassInstallParams(hDEVINFO,
                                     pDevData,
                                     (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
                                     sizeof(PropChangeParams)))
    {
                return FALSE;
    }
    
    PropChangeParams.ClassInstallHeader.cbSize=sizeof(SP_CLASSINSTALL_HEADER);
    PropChangeParams.ClassInstallHeader.InstallFunction=DIF_PROPERTYCHANGE;
    PropChangeParams.Scope=DICS_FLAG_CONFIGSPECIFIC;
    PropChangeParams.StateChange=dwNewState;
    PropChangeParams.HwProfile=0;    //改变设备属性并调用安装服务
    if( (!SetupDiSetClassInstallParams(hDEVINFO,
        pDevData,
        (SP_CLASSINSTALL_HEADER *)&PropChangeParams,
        sizeof(PropChangeParams))) || 
        (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,hDEVINFO,pDevData)))
    {
        return FALSE;
    }
    else
    {
        PrinterDebugInfo("Start success");
        return TRUE;
    }
}想请教一下各位,为什么在不同机器上有不同的结果?以上的代码有什么问题吗?
第二个问题是:
我的程序观测到该usb设备已经断开连接(物理上是一直连接着的),windows系统返回的错误号是:31,
表示是A device attached to the system is not functioning(连到系统上的设备没有发挥作用)意思.停用这个usb设备后,再启用它,可惜的是再和该设备进行通信时,还是有错误。感觉到没有成功启用该设备一样,但是从windows的设备管理器观察,
该usb设备已经是处于启用的状态的。
有以下几个小疑问:
1 当设备断开连接时,ReadFile函数返回失败,错误号是:31,过一秒后,调用WriteFile函数,返回失败,错误号也是31.之后就一直阻塞在(ReadFile或WriteFile函数中了) 为什么过了一秒后,系统还会返回该错误?
2 当使用ReadFile观测到该usb设备已经断开连接时,再停止该usb设备,再启动该usb设备,理论上此时进行通信是应该成功的,但是再进行WriteFile动作的时候,还是失败,windows的错误信息还是31.请问是否应该启用设备后再等1,2秒后再进行操作呢。