检测USB设备

[复制链接]
368|12
手机看帖
扫描二维码
随时随地手机跟帖
pangb|  楼主 | 2017-12-17 16:34 | 显示全部楼层 |阅读模式
USB, RAM, ev, ge, AN
我在编码检测USB设备的时候遇到一个问题,一直解决不了。待检测的USB设备是自行设计的,可以正常工作。在程序中,我用OnUSBChange(WPARAM wParam, LPARAM lParam)函数响应WM_DEVICECHANGE消息。为了简单起见,我将代码简化如下:

LRESULT CMainFrame::OnUSBChange(WPARAM wParam, LPARAM lParam)
{
DEV_BROADCAST_HDR *pDEV = (DEV_BROADCAST_HDR*)lParam;

if (wParam == DBT_DEVICEARRIVAL)
{
AfxMessageBox("OK");
}

if (wParam == DBT_DEVICEREMOVECOMPLETE)
{
AfxMessageBox("NO");
}

   return CWnd::OnDeviceChange(wParam, lParam);
}
pangb|  楼主 | 2017-12-17 16:35 | 显示全部楼层

由于担心没有注册消息,我又添加了函数RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode),代码如下

void CMainFrame::RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode)
{
    DEV_BROADCAST_DEVICEINTERFACE *pFilterData =  
(DEV_BROADCAST_DEVICEINTERFACE*)  
_alloca(sizeof(DEV_BROADCAST_DEVICEINTERFACE));
    ASSERT (pFilterData);

UUID GUID_CLASS_INPUT;
UuidFromString((unsigned char*)"36FC9E60-C465-11CF-8056-444553540000", &GUID_CLASS_INPUT);

   ZeroMemory(pFilterData, sizeof(DEV_BROADCAST_DEVICEINTERFACE));

   pFilterData->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    pFilterData->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    pFilterData->dbcc_classguid = GUID_CLASS_INPUT;  

   *hNotifyDevNode = RegisterDeviceNotification(hDlg, pFilterData, DEVICE_NOTIFY_WINDOW_HANDLE);
}

这个函数在窗体创建时调用。

使用特权

评论回复
chenjunt| | 2017-12-17 16:39 | 显示全部楼层

你有什么想法?

使用特权

评论回复
pangb|  楼主 | 2017-12-17 16:40 | 显示全部楼层
按照我的设想,在我的USB设备拔插的时候应该有WM_DEVICECHANGE消息,触发响应函数,而函数的参数wParam应该是DBT_DEVICEARRIVAL或者DBT_DEVICEREMOVECOMPLETE。

但实际测试时,我发现WM_DEIVCECHANGE消息始终能发出,函数能正确响应,可wParam的值始终为7,不是我们需要的值。

程序不变,我又拿U盘和移动硬盘作了测试,结果可以正确获取DBT_DEVICEARRIVAL或者DBT_DEVICEREMOVECOMPLETE。

不知我的代码在哪出了问题,为什么不能检测自己的USB设备呢?

使用特权

评论回复
ousj| | 2017-12-17 16:42 | 显示全部楼层

如果标准USB设备能正常说明你的程序没问题。

使用特权

评论回复
pangb|  楼主 | 2017-12-17 16:48 | 显示全部楼层
这种情况也可能有,但是还有一个情况,还有一款USB设备也是自己做的,但是用了CYPRESS提供的一个USB类对下位机进行访问,这款USB设备的拔插是可以访问的。而我前面所说的不能识别拔插的USB设备是用IOCONTROL对下位机访问的,所以我怀疑可以在PC软件上下手解决这个问题。又因为那个USB类无法在我前面提到的设备上应用,所以只能自己想办法解决。

使用特权

评论回复
morrisk| | 2017-12-17 16:49 | 显示全部楼层
做上位机就是这么郁闷,下位机不对出相应的接口,会把你累死。

使用特权

评论回复
zyf部长| | 2017-12-17 16:51 | 显示全部楼层
上位机的设备处理消息,如你所述,但是也要USB设备驱动支持热插拔哦才行啊

也就说,当设备插入拔出时,需要操作系统通知用户程序

显然,你门的那个usb设备驱动程序没有考虑支持热插拔

使用特权

评论回复
pangb|  楼主 | 2017-12-17 16:53 | 显示全部楼层
有道理,我从这方面考虑一下

使用特权

评论回复
xxmmi| | 2017-12-17 16:54 | 显示全部楼层

你的设备在设备管理器上是怎样的状态?怎样被系统识别的?

使用特权

评论回复
kangzj| | 2017-12-17 16:57 | 显示全部楼层

换个支持pnp的驱动程序试试。

使用特权

评论回复
zwll| | 2017-12-17 16:59 | 显示全部楼层
afx_msg BOOL OnDeviceChange(
    UINT nEventType,
    DWORD_PTR dwData  
)的参数是这样的。按道理系统是通过WM_DEVICECHANGE消息通知设备的PNP的。例如,
BOOL CxxxClass::OnDeviceChange(UINT nEventType, DWORD dwData)
{
    ......
    switch(nEventType)
    {
    ....
    case DBT_DEVICEARRIVAL
    ....
    }
      
   PDEV_BROADCAST_DEVICEINTERFACE pdbch = (PDEV_BROADCAST_DEVICEINTERFACE)dwData;
    .....
}
如果设备支持热插拔,且消息进行了映射登记,应该就没有问题的。

使用特权

评论回复
pangb|  楼主 | 2017-12-17 17:00 | 显示全部楼层

明白了,结贴

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

701

主题

7643

帖子

6

粉丝