停用后启用usb设备的问题?

kacy16 2011-10-07 03:22:10
小弟我手头上一个项目,需要对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秒后再进行操作呢。
...全文
140 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kacy16 2011-10-09
  • 打赏
  • 举报
回复
谢谢songjinshi的回复.谢谢!
Vincent_Song 2011-10-08
  • 打赏
  • 举报
回复
建议LZ查找一些USB设备的资料看一下,同时自己测试一下猜想,应该可以解决问题!

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧