注册名:

密码:

个人注册

企业注册

商务申请

商务管理平台

企业管理平台

个人管理平台

我的工控博客

中国工控网www.chinakong.com

首页 | 新闻中心 | 工控论坛 | 经验视点 | 工控商务 | 电气手册 | 工控博客 | 招聘求职 | 网上调查 | 企业中心 | 供求信息 | 资料中心 | 工控书店

所在位置:工控论坛 -- 工控机论坛 -- 工控机论坛(非专题) -- 结构与配置

中国工控网搜索:

 登陆:密码:  注册  密码

搜索:

工控机论坛(非专题)分类  

全部论题

结构与配置

数据 I/O

编程与维护

应用方案

发表人:emtronix 发表时间:2011/1/8 22:23:00  

 

 本栏论题: 如何实现WinCE系统中USB设备自动检测  [1632]

    英创公司ARM9系列工控主板预装正版WinCE操作系统,提供标准USB接口,本文介绍如何在应用程序中判断USB存储设备的插入和移出操作。
    方法一:思路是在应用程序创建一个线程,在线程里循环定时查询系统中是否存在USB存储设备,可以通过读取系统注册表或调用 API函数来实现,下面是通过API函数查询USB存储设备的程序片段。
    STOREINFO StoreInfo;
    hDevice = FindFirstStore( &StoreInfo );
    if( INVALID_HANDLE_VALUE != hDevice )
    {
    do
    {
    //判断是否为USB存储设备
    if( 0 == _tcscmp( StoreInfo.szStoreName, _T('USB Hard Disk Drive') ) )
    {
    //如果查找到USB存储设备,则打印信息到调试串口
    RETAILMSG( 1, (TEXT('USB%shas been inserted\n' ) ,
    StoreInfo.szDeviceName ));
    }
    }while( FindNextStore( hDevice, &StoreInfo ) );
    }
    方法二:上面的方法在效率和实时性方面都不能令人满意,通常只用作检测U盘是否已接入到系统中,如果要实时的检测U盘的插入,移出操作,推荐使用下面提出的方法。
    当USB设备插入或从系统中移出时,系统会产生WM_DEVICECHANGE消息,应用程序只需要处理这个消息就可以方便的判断U盘的插入和移出操作,我们需要关心WM_DEVICECHANGE消息wParam参数的两个取值:
    DBT_DEVICEARRIVAL //设备插入
    DBT_DEVICEREMOVECOMPLETE //设备移出
    (WM_DEVICECHANGE消息更详细的信息,请参考MSDN WM_DEVICECHANGE Message http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx)
    值得注意的是当网络设备插入和移出时,也会触发这个消息,这样就会对判断是否为USB设备产生影响,不过,在WM_DEVICECHANGE消息的lParam参数中保存了设备的相关信息,对设备类型进行判断,只需要获得DEV_BROADCAST_VOLUME结构中的dbcv_flags的值,当它的值为DBTF_INET时,表示产生此消息的设备是网络设备,它的值等于DBTF_MEDIA时,表示产生消息的是媒体设备。对WM_DEVICECHANGE消息了解后,就可以利用它,在程序中实时检测USB设备的插入和移出了。下面是节略的程序片段。
    //窗口回调函数中,当系统消息为WM_DEVICECHANGE时,调用此函数
   
    LRESULT USBDetect( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
    {
    PDEV_BROADCAST_VOLUME dbvDev = (PDEV_BROADCAST_VOLUME)lParam;
    if( dbvDev->dbcv_flags & DBTF_MEDIA ) //判断是否为USB存储设备
    {
    switch( wParam )
    {
    case DBT_DEVICEARRIVAL: //USB存储设备插入
    RETAILMSG(1, (TEXT( 'USBDisk%c is inserted\n'), dbvDev->dbcv_name[0]));
    break;
    case DBT_DEVICEREMOVECOMPLETE: //USB存储设备移出
    RETAILMSG( 1, (TEXT( 'USBDisk%c is remove\n'), dbvDev->dbcv_name[0] ));
    break;
    }
    }
    return 0;
    }
   
   
   
   

如果要回复本栏论题,请首先中国工控网www.chinakong.com

·如果你已经是中国工控网www.chinakong.com成员,请直接登录。

·如果你还不是中国工控网www.chinakong.com成员,请首先注册,注册为免费!

注册名:

密  码:

           注册中国工控网www.chinakong.com
           忘记密码

关闭该窗口

关于我们     免责声明     服务项目     广告联系     友情链接     联系方式     意见反馈     设为首页     加入收藏

 ©2023-2025 中国工控网(www.chinakong.com) 版权所有 豫ICP备17046657号

管理员信箱:chinakong98@163.com  服务热线:13525974529

洛阳博德工控自动化技术有限公司

中国    洛阳