英创信息技术如何实现WinCE系统中USB设备自动检测概述

描述

  英创公司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;

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分