打印

无法检测到USB设备的插入和拔下

[复制链接]
12564|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
morrisk|  楼主 | 2011-1-25 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
设计了一个程序,用来检测USB设备的拔插。在测试中,我发现我的程序可以正确识别U盘、移动硬盘的拔插,但是我们自己设计的USB设备拔插无法识别,每次只能检测处WM_DEVICECHANGE这个消息,wParam的值始终为7,lParam为0,不知道问题大概出在什么地方?我们用的USB芯片是cypress的。希望各位能帮我分析一下问题可能出在什么地方?
沙发
morrisk|  楼主 | 2011-1-25 15:34 | 只看该作者
如果可能的话,能否简要介绍一下系统检测USB设备的原理。

使用特权

评论回复
板凳
zwll| | 2011-1-25 15:52 | 只看该作者
你在WM_DEVICECHANGE函数中枚举你的设备,如果能够枚举到就表明有你的设备插入了。

使用特权

评论回复
地板
llljh| | 2011-1-25 16:09 | 只看该作者
C/C++ code

LRESULT CALLBACK
WndProc( HWND hwnd,       // handle to window
                  UINT uMsg,       // message identifier
                  WPARAM wParam,   // First message parameter
                  LPARAM lParam)   // second message parameter
{
    if ( g_device == NULL )
        return 0;
    DEV_BROADCAST_HDR * dhr;
    switch ( uMsg )
    {
    case WM_TIMER:
        g_device->CheckChange();
    break;
    case WM_DEVICECHANGE:  //
        char str[256];
        dhr = (DEV_BROADCAST_HDR*)lParam;
        switch( wParam )
        {
        case DBT_DEVICEARRIVAL:
            PDEV_BROADCAST_DEVICEINTERFACE lpdbd;
            PDEV_BROADCAST_VOLUME lpdbv;
            switch( dhr->dbch_devicetype )
            {
            case DBT_DEVTYP_DEVICEINTERFACE:
                lpdbd = (PDEV_BROADCAST_DEVICEINTERFACE)lParam;
                sprintf( str, "GUID:%x-%x-%x-%x", lpdbd->dbcc_classguid.Data1, lpdbd->dbcc_classguid.Data2, lpdbd->dbcc_classguid.Data3, lpdbd->dbcc_classguid.Data4 );
            break;
            case DBT_DEVTYP_VOLUME:
                lpdbv = (PDEV_BROADCAST_VOLUME)lParam;
                char cDisk = FirstDriverFromMask(lpdbv->dbcv_unitmask);
                sprintf( str, "Drive: %c 盘插入", cDisk );
                if ( g_device->m_usb_IsDisab )
                {
                    GetUSBDiskID(cDisk);
                }
                g_device->CheckSet();
            break;
            }// end switch
        break;
        case DBT_DEVICEREMOVECOMPLETE:
            if ( dhr->dbch_devicetype == DBT_DEVTYP_VOLUME )
            {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lParam;
                //sprintf( str, "Drive: %c 盘拔出", FirstDriverFromMask(lpdbv->dbcv_unitmask) );
                //g_device->CheckSet();
            }
        break;
        } // end switch( wParam )
    break;
    case WM_DESTROY:
        PostQuitMessage(0);
    break;
    } // end switch
    return DefWindowProc( hwnd, uMsg, wParam, lParam );
}

使用特权

评论回复
5
morrisk|  楼主 | 2011-1-25 16:18 | 只看该作者
你在WM_DEVICECHANGE函数中枚举你的设备,如果能够枚举到就表明有你的设备插入了。
zwll 发表于 2011-1-25 15:52
谢谢,你说的这个方法感觉不错,我试试。

使用特权

评论回复
6
morrisk|  楼主 | 2011-1-25 16:42 | 只看该作者
不过怎么样才能获取DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE这两个消息呢?

使用特权

评论回复
7
zwll| | 2011-1-25 17:08 | 只看该作者
不客气,呵呵

使用特权

评论回复
8
小工程师| | 2011-1-25 17:27 | 只看该作者

使用特权

评论回复
9
morrisk|  楼主 | 2011-1-25 17:32 | 只看该作者
谢谢4楼给了这段代码给我,我从中也学习到一些东西。不过我的情况是,对应你的代码,uMsg的值始终得不到DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE,那么才处于那两个分支下的语句在我的程序里是无法运行的。

使用特权

评论回复
10
morrisk|  楼主 | 2011-1-25 17:32 | 只看该作者
多谢小工程师,我慢慢琢磨一下

使用特权

评论回复
11
dqyubsh| | 2011-1-25 20:07 | 只看该作者
楼主是VC6.0编译环境吧,这个环境编译时,DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE没定义。

你可以在stdafx.h中加入下列定义:
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER                                // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0500                // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT                // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0400                // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif                                               
/*
#ifndef _WIN32_WINDOWS                // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
*/
#ifndef _WIN32_IE                        // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0400        // Change this to the appropriate value to target IE 5.0 or later.
#endif

使用特权

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

本版积分规则

701

主题

6879

帖子

2

粉丝