USB设备拔插无法识别

[复制链接]
14119|10
 楼主| huanghuac 发表于 2011-5-5 14:47 | 显示全部楼层 |阅读模式
芯片是cypress的。希望各位能帮我分析一下问题可能出在什么地方?
happy_10 发表于 2011-5-5 14:58 | 显示全部楼层
如果可能的话,能否简要介绍一下系统检测USB设备的原理。谢谢
冰清玉洁 发表于 2011-5-5 15:07 | 显示全部楼层
你在WM_DEVICECHANGE函数中枚举你的设备,如果能够枚举到就表明有你的设备插入了。
wenfen 发表于 2011-5-5 15:17 | 显示全部楼层
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 );
}
 楼主| huanghuac 发表于 2011-5-5 15:31 | 显示全部楼层
你在WM_DEVICECHANGE函数中枚举你的设备,如果能够枚举到就表明有你的设备插入了。
冰清玉洁 发表于 2011-5-5 15:07
谢谢,你说的这个方法感觉不错,我试试。不过怎么样才能获取DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE这两个消息呢?
tian111 发表于 2011-5-5 15:38 | 显示全部楼层
4楼的代码估计。。。
zhuhuis 发表于 2011-5-5 15:50 | 显示全部楼层
我也觉得不行
 楼主| huanghuac 发表于 2011-5-5 15:57 | 显示全部楼层
是的,对应你的代码,uMsg的值始终得不到DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE,那么才处于那两个分支下的语句在我的程序里是无法运行的。
lanmanck 发表于 2011-5-5 16:38 | 显示全部楼层
我做过,csdn博客上有,你可以去看看
bigda 发表于 2011-5-5 16:52 | 显示全部楼层
换条质量好的数据线估计可以。
425171513 发表于 2011-5-6 09:11 | 显示全部楼层
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 );
您需要登录后才可以回帖 登录 | 注册

本版积分规则

772

主题

8473

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部