英創(chuàng)公司ARM9系列工控主板預(yù)裝正版WinCE操作系統(tǒng),提供標(biāo)準(zhǔn)USB接口,本文介紹如何在應(yīng)用程序中判斷USB存儲(chǔ)設(shè)備的插入和移出操作。
方法一:思路是在應(yīng)用程序創(chuàng)建一個(gè)線程,在線程里循環(huán)定時(shí)查詢系統(tǒng)中是否存在USB存儲(chǔ)設(shè)備,可以通過(guò)讀取系統(tǒng)注冊(cè)表或調(diào)用 API函數(shù)來(lái)實(shí)現(xiàn),下面是通過(guò)API函數(shù)查詢USB存儲(chǔ)設(shè)備的程序片段。
STOREINFO StoreInfo;
hDevice = FindFirstStore( &StoreInfo );
if( INVALID_HANDLE_VALUE != hDevice )
{
do
{
// 判斷是否為USB存儲(chǔ)設(shè)備
if( 0 == _tcscmp( StoreInfo.szStoreName, _T(‘USB Hard Disk Drive’) ) )
{
// 如果查找到USB存儲(chǔ)設(shè)備,則打印信息到調(diào)試串口
RETAILMSG( 1, (TEXT(‘USB%shas been inserted\n’ ) ,
StoreInfo.szDeviceName ));
}
}while( FindNextStore( hDevice, &StoreInfo ) );
}
方法二:上面的方法在效率和實(shí)時(shí)性方面都不能令人滿意,通常只用作檢測(cè)U盤是否已接入到系統(tǒng)中,如果要實(shí)時(shí)的檢測(cè)U盤的插入,移出操作,推薦使用下面提出的方法。
當(dāng)USB設(shè)備插入或從系統(tǒng)中移出時(shí),系統(tǒng)會(huì)產(chǎn)生WM_DEVICECHANGE消息,應(yīng)用程序只需要處理這個(gè)消息就可以方便的判斷U盤的插入和移出操作,我們需要關(guān)心WM_DEVICECHANGE消息wParam參數(shù)的兩個(gè)取值:
DBT_DEVICEARRIVAL // 設(shè)備插入
DBT_DEVICEREMOVECOMPLETE // 設(shè)備移出
(WM_DEVICECHANGE消息更詳細(xì)的信息,請(qǐng)參考MSDN WM_DEVICECHANGE Message http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx)
值得注意的是當(dāng)網(wǎng)絡(luò)設(shè)備插入和移出時(shí),也會(huì)觸發(fā)這個(gè)消息,這樣就會(huì)對(duì)判斷是否為USB設(shè)備產(chǎn)生影響,不過(guò),在WM_DEVICECHANGE消息的lParam參數(shù)中保存了設(shè)備的相關(guān)信息,對(duì)設(shè)備類型進(jìn)行判斷,只需要獲得DEV_BROADCAST_VOLUME結(jié)構(gòu)中的dbcv_flags的值,當(dāng)它的值為DBTF_INET時(shí),表示產(chǎn)生此消息的設(shè)備是網(wǎng)絡(luò)設(shè)備,它的值等于DBTF_MEDIA時(shí),表示產(chǎn)生消息的是媒體設(shè)備。對(duì)WM_DEVICECHANGE消息了解后,就可以利用它,在程序中實(shí)時(shí)檢測(cè)USB設(shè)備的插入和移出了。下面是節(jié)略的程序片段。
// 窗口回調(diào)函數(shù)中,當(dāng)系統(tǒng)消息為WM_DEVICECHANGE時(shí),調(diào)用此函數(shù)
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存儲(chǔ)設(shè)備
{
switch( wParam )
{
case DBT_DEVICEARRIVAL: // USB存儲(chǔ)設(shè)備插入
RETAILMSG(1, (TEXT( ‘USBDisk%c is inserted\n’), dbvDev-》dbcv_name[0]));
break;
case DBT_DEVICEREMOVECOMPLETE: // USB存儲(chǔ)設(shè)備移出
RETAILMSG( 1, (TEXT( ‘USBDisk%c is remove\n’), dbvDev-》dbcv_name[0] ));
break;
}
}
return 0;
}
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6086瀏覽量
35638
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論