
IC693PCM300 IC693PCM301 IC693P
◆ 联系人:陈云芳《经理》
IC693PCM300 IC693PCM301 IC693P
我司是一家多年专业从事大型进口系统(集散式控制系统、可编程控制器、冗余容错控制系统、机器人系统)备件销售。主营品牌Foxboro,Tricon,Ovation,Motorola,Xycom,ABB,Allen-Bradley,Schneider,Siemens,GE Fanuc,Yaskawa,Woodward等进口自动化系统备件销售及系统集成的高新技术企业。
◆ 手机:13779956579
◆ Q Q:438161014
◆ E-mail: 438161014@qq.com
诚信经营,质量为首,诚信至上,深圳长欣 竭诚为您服务,欢迎您的咨询!
有时应用需要检查USB设备的加载与卸除消息,如U盘的插上与拔出。一种办法是以轮询的方式调用设备接口尝试访问设备,但这样的做法效率很低,并且实时性不高。本文将介绍更为通用的方法,通过系统API函数RequestDeviceNotifications,读取设备消息,获得设备加载及移除的消息。
查找设备IClass值
每个USB设备都有一个IClass值,相当于在系统里的编号,IClass值可以通过查询板子注册表获得。以U盘为例:
如图,[HKEY_LOCAL_MACHINE\Drivers\USB\ClientDrivers]下存有所有USB设备类型的信息。Mass_Storage_Class即U盘的IClass值为{A4E7EDDA-E575-4252-9D6B-4195D48BB865}
用代码表示即
GUID guid = { 0xA4E7EDDA, 0xE575, 0x4252, { 0x9D, 0x6B, 0x41, 0x95, 0xD4, 0x8B, 0xB8, 0x65 } };
调用API监听设备消息
监听流程如下:
创建消息队列->绑定设备和消息队列->读取消息队列
以U盘为例,代码如下
MSGQUEUEOPTIONS msgopts;
//{A4E7EDDA-E575-4252-9D6B-4195D48BB865} 这个是USB storage的
GUID guid = { 0xA4E7EDDA, 0xE575, 0x4252, { 0x9D, 0x6B, 0x41, 0x95, 0xD4, 0x8B, 0xB8, 0x65 } };
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = 0;
msgopts.dwMaxMessages = 10; //?
msgopts.cbMaxMessage = sizeof(MYDEV);
msgopts.bReadAccess = TRUE;
HANDLE m_hReadMsgQ = CreateMsgQueue(NULL, &msgopts);
HANDLE hNotify;
DWORD ret;
hNotify = RequestDeviceNotifications(&guid, m_hReadMsgQ, TRUE);
flags = 0;
size = 0;
//while(true){
ret = WaitForSingleObject(m_hReadMsgQ, INFINITE);
if(ret == WAIT_OBJECT_0)
{
while (ReadMsgQueue(m_hReadMsgQ, &detail, sizeof(detail), &size, 1, &flags) == TRUE) //参数“1”表示1ms超时
{
if (detail.d.fAttached)
{
wprintf(L"%s %s,f=0x%x\r\n", detail.d.szName, detail.d.fAttached ? L"appeared" : L"was removed", flags);
}
Else
{
wprintf(L"%s %s,f=0x%x\r\n", detail.d.szName, detail.d.fAttached ? L"appeared" : L"was removed", flags);
}// if (detail.d.fAttached)
}//while
}//if(ret == WAIT_OBJECT_0)
//}while(true)
CloseMsgQueue(m_hReadMsgQ);
注意:如果是U盘,这里读到的detail.d.szName是U盘在驱动中的名称,如“DSK1”,并非U盘盘符。
消息队列里读到的消息包括已加载设备的加载消息。
根据设备加载消息获得准确的设备信息
以U盘为例,它的设备类型为“DSK”,而SD卡,NANDFLASH的设备类型也是DSK,所以从设备消息里读出设备名如“DSK1”、“DSK2”后并不能直观确定哪个是U盘的设备名。
这时可以调用存储器相关API函数OpenStore根据设备名,查询U盘盘符等信息。
必要的头文件及lib库
#include "Storemgr.h"
#pragma comment(lib,"Storeapi.lib")
封装OpenStore函数
增加超时是有必要的,因为设备加载消息来得更快,可能存储设备还没完全加载好。最长可能慢1ms,所以稍加延时即可。
HANDLE WINAPI OpenStoreEx(LPCTSTR szDeviceName, DWORD timeout = 3)
{
HANDLE hStore;
int i;
for(i=0;i
{
hStore = OpenStore(szDeviceName);
if (hStore != INVALID_HANDLE_VALUE)
{
break;;
}
Sleep(1);
}
return hStore;
}
获得详细信息
GetStoreInfo(hStore, &StoreInfo);
//if(wcscmp(StoreInfo.szStoreName, L"SD Memory Card") == 0) //判断是SD卡
//else if(wcscmp(StoreInfo.szStoreName, L"NANDFS") == 0) //判断是NandFlash
//else if (wcscmp(StoreInfo.szStoreName, L"USB Hard Disk Drive") == 0) //判断是U盘
wprintf(L"%s %s %s,f=0x%x\r\n", detail.d.szName, StoreInfo.szStoreName, detail.d.fAttached ? L"appeared" : L"was removed", flags);
用链表存储设备信息
在U盘加载时,可以通过访问存储驱动API来查询设备信息。但是当设备移除后,设备信息就不存在于驱动中了,所以用OpenStore和GetStoreInfo就无法查到已移除的设备信息了。
想要知道移除的设备详细信息,就只有在加载的时候将信息存在数据结构中。这样在移除时,通过查询数据结构中的数据,就可以获得设备详细信息了。
数据结构根据实际需求,使用数组,链表,MAP,都可以。英创对客户提供一份使用单向链表实现的例程。
其它设备
USB扩展串口模块
英创主板扩展串口号均在10以上,所以通过设备名中的设备号,能很容易确定是否为USB扩展的串口设备。
USB打印机、摄像头等
这些USB设备通过设备名即能确定是什么USB设备。
相关例程可以联系英创工程师获得。
IC693ACC300
IC693ADS301
IC693ALG220
IC693ALG221
IC693ALG222
IC693ALG223
IC693ALG390
IC693ALG391
IC693ALG392
IC693ALG442
IC693APU300
IC693APU305
IC693BEm331
IC693CHS391
IC693CHS392
IC693CHS393
IC693CHS397
IC693CHS398
IC693CHS399
IC693CMM301
IC693CMM302
IC693CMM311
IC693CMM321
IC693CPU311
IC693CPU313
IC693CPU323
IC693CPU331
IC693CPU340
IC693CPU341
IC693CPU350
IC693CPU351
IC693CPU352
IC693CPU360
IC693CPU363
IC693CPU364
IC693CPU374
IC693MAR590
IC693MDL230
IC693MDL231
IC693MDL240
IC693MDL241
IC693MDL310
IC693MDL330
IC693MDL340
IC693MDL390
IC693MDL632
IC693MDL634
IC693MDL645
IC693MDL646
IC693MDL648
IC693MDL653
IC693MDL654
IC693MDL655
IC693MDL730
IC693MDL731
IC693MDL732
IC693MDL733
IC693MDL734
IC693MDL740
IC693MDL741
IC693MDL742
IC693MDL748
IC693MDL750
IC693MDL751
IC693MDL752
IC693MDL753
IC693MDL930
IC693MDL931
IC693MDL940
IC693MDR390
IC693PBM200
IC693PBM201
IC693PCM300
IC693PCM301
IC693PCM311
IC693PRG300
IC693PWR321
IC693PWR322
IC693PWR328
IC693PWR330
IC693PWR331
IC693PWR332
IC693APU301
IC693APU302
IC693DSM302
IC693DSM314
IC697ALG230
IC697ALG320
IC697ALG440
IC697ALG441
IC697BEM711
IC697BEM713
IC697BEM731
IC697BEM733
IC697BEM741
IC697BEM761
IC697CGR772
IC697CGR935
IC697CHS750
IC697CHS782
IC697CHS783
IC697CHS790
IC697CHS791
IC697CMM711
IC697CMM721
IC697CMM741
IC697CMM742
IC697CPM790
IC697CPM914
IC697CPM915
IC697CPM924
IC697CPU731
IC697CPU732
IC697CPU771
IC697CPU772
IC697CPU781
IC697CPU782
IC697CPX772
IC697CPX782
IC697CPX928
IC697CPX935
IC697HSC700
IC697MDL240
IC697MDL241
IC697MDL250
IC697MDL251
IC697MDL252
IC697MDL253
IC697MDL254
IC697MDL340
IC697MDL341
IC697MDL350
IC697MDL640
IC697MDL651
IC697MDL652
IC697MDL653
IC697MDL654
IC697MDL740
IC697MDL750
IC697MDL752
IC697MDL753
IC697MDL940
IC697MEM713
IC697MEM715
IC697MEM717
IC697MEM719
IC697MEM731
IC697MEM732
IC697MEM733
IC697MEM735
IC697MEM711
IC697PWR710
IC697PWR711
IC697PWR724
IC697PWR748
IC697RCM711
*您的姓名:
*联系手机:
固话电话:
E-mail:
所在单位:
需求数量:
*咨询内容: