USB设备首次接入电脑时遇到的一些问题及解决方法

HID设备已测试通过

1新设备第一次连接电脑,

2后续非首次连接时

1监控打开后,连接USB设备

 

2USB设备连接状态时,打开监控,拔除后重新连接:

 

 

3USB插拔多次的结果:


3经验总结:

非首次连接新设备:

1:移除USB时,首先收到两次DBT_DEVNODES_CHANGED。然后会收到一次 DBT_DEVICEREMOVECOMPLETE

2:插入USB时,首先会收到三次DBT_DEVNODES_CHANGED,然后会收到一次 DBT_DEVICEARRIVAL,之后还会收到一次DBT_DEVNODES_CHANGED

首次连接新设备:

1:插入USB时,

首先收到四次DBT_DEVNODES_CHANGED

然后收到一次DBT_DEVICEARRIVAL

然后收到两次DBT_DEVNODES_CHANGED

然后收到一次DBT_DEVICEREMOVECOMPLETE

然后收到一次DBT_DEVNODES_CHANGED

然后收到一次DBT_DEVICEARRIVAL

然后收到一次DBT_DEVNODES_CHANGED

2:移除USB时:

首先收到两次DBT_DEVNODES_CHANGED

然后收到一次DBT_DEVICEREMOVECOMPLETE

4:结论:

1:对于新设备(首次连接)或非首次连接设备,统一起见,我们做如下处理:

处理OnDeviceChange消息中,根据接收到的DBT_DEVNODES_CHANGED的次数(3,5,6,7及以上)来判断是否识别成功,其中nMessageNum为接收DBT_DEVNODES_CHANGED的次数。

2:对于消息DBT_DEVICEQUERYREMOVE的获取,参考http://blog.csdn.net/Sephoenix/article/details/5442064的方法。

WM_DEVICECHANGE 里默认是只注册了 DBT_DEVICEREMOVECOMPLETE 和 DBT_DEVICEARRIVAL 消息,所以只能接收到这两个,如果要使用其他的消息,必需手动注册一下才可以。

5:附录代码:

void CNIBPTestSoftDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
	switch(nEventType)
	{
	case DBT_DEVICEREMOVECOMPLETE:   //设备移除
		{
			_cprintf("----DBT_DEVICEREMOVECOMPLETE--检测到设备移除完成\n");
			PDEV_BROADCAST_HDR pdb;
			
			pdb = (PDEV_BROADCAST_HDR)dwData;
			if(pdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
			{
				PDEV_BROADCAST_DEVICEINTERFACE pDevInf;
				pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pdb;
				TRACE("%s\n", pDevInf->dbcc_name);

				CString strPath = pDevInf->dbcc_name;

				//将关联此路径的HID模拟仪设备窗口置为可用状态
				for(int n=0; n<m_vecTestWnd.size(); ++n)
				{
					CString strTemp = m_vecTestWnd.at(n)->GetHIDDevPath();
					strTemp.MakeUpper();
					strPath.MakeUpper();
					if(strTemp == strPath)
					{
						int nComNum = m_vecTestWnd.at(n)->m_nComNum;
						m_mapSimulateInfo[nComNum].bFlagUse = FALSE; //置为可用状态
						m_vecTestWnd.at(n)->OnRemove();  //移除设备信息
						break;
					}
				}
			}
			break;
		}
	case DBT_DEVICEARRIVAL://表示有设备插入并可用,
		{
			_cprintf("----DBT_DEVICEARRIVAL--检测到新设备连接并可用\n");

			PDEV_BROADCAST_HDR pdb;
			
			pdb = (PDEV_BROADCAST_HDR)dwData;
			if(pdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
			{
				if (nMessageNum >= 7 || nMessageNum == 3 || nMessageNum == 5 || nMessageNum == 6)
				{
					_cprintf("检测完成----执行FreshDeviceChange函数---nMessageNum清零---\n");
					Sleep(1000);
					nMessageNum = 0;
					FreshDeviceChange();
				}
			}
			
			break;
		}
	case DBT_DEVNODES_CHANGED:
		{
			_cprintf("----DBT_DEVNODES_CHANGED---接收第%d次\n", ++nMessageNum);
			break;
		}
	case DBT_DEVICEQUERYREMOVE:
		{
			_cprintf("----DBT_DEVICEQUERYREMOVE---检测到设备准备移除\n");
			break;
		}
	}
	
	return;
}


 

参考:http://blog.hehehehehe.cn/a/410.htm

 

插入u盘时,会发送好几次WM_DEVICECHANGE消息。

要检测设备插入或者移除,最好使用DBT_DEVICEARRIVALDBT_DEVNODES_CHANGED来细分判断,当插入USB的时候WM_DEVICECHANGE会发生很多次。

当你USB插入的时候会收到WM_DEVICECHANGE消息,WPARAMDBT_DEVICEARRIVAL,另外还会接受到六个DBT_DEVNODES_CHANGED ,此消息表示虚拟设备的插入和删除,第一次接受DBT_DEVICEARRIVAL,表示设备插入成功,后面的DBT_DEVNODES_CHANGED表示文件系统,驱动设备更新完毕

如果想通过WM_DEVICECHANGE消息来判断,当设备插入,设备拨出,设备准备好,都会发生WM_DEVICECHANGE消息,使用的时候需要判断wParam的值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们将USB驱动程序添加到存储区,可能会遇到以下问题: 1. 不兼容的驱动程序:有候我们下载的驱动程序可能与我们的操作系统或设备不兼容。此,我们需要查看设备的规格要求和驱动程序的兼容性列表,确保驱动程序与设备兼容。 2. 驱动程序安装错误:添加驱动程序,我们需要确保正确地安装驱动程序。如果驱动程序没有正确安装,设备可能无法识别或无法正常工作。解决这个问题方法是重安装驱动程序,或者查看厂商提供的驱动程序安装说明。 3. 病毒或恶意软件:有候我们从不受信任的源下载驱动程序,可能会导致病毒或恶意软件的感染。这些恶意软件可能会破坏驱动程序或设备,导致问题。为了解决这个问题,我们应该只从经过验证的官方网站或受信任的来源下载驱动程序。 4. 资源冲突:有候添加USB驱动程序之后,可能会发生资源冲突的情况。这可能是因为驱动程序需要的资源与其他设备或驱动程序之间产生了冲突。解决问题方法包括更改设备的资源配置或禁用其他冲突的设备。 在遇到以上问题,我们可以尝试以下解决方法: - 重下载并安装适用于设备和操作系统的驱动程序; - 执行病毒扫描,确保下载的驱动程序是安全的; - 确保设备与计算机正常连接,检查USB线缆及接口; - 更操作系统和设备的驱动程序; - 在设备管理器中禁用并重启用USB驱动程序; - 运行Windows硬件和设备故障排除工具。 如果问题仍然存在,建议咨询设备制造商或寻求专业技术支持以获得更进一步的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值