2024年4月11日发(作者:)
mfc 枚举usb 描述符 -回复
标题:MFC框架下枚举USB描述符的详细步骤
在现代计算机系统中,USB(Universal Serial Bus)设备的广泛应用使得
开发者需要掌握如何与其进行有效的通信。其中,理解并枚举USB描述
符是关键的一步。本文将以MFC(Microsoft Foundation Classes)框
架为背景,详细介绍如何枚举USB描述符。
一、USB描述符概述
USB描述符是USB设备向主机提供自身信息的数据结构,包括设备描述
符、配置描述符、接口描述符、端点描述符等。这些描述符包含了设备的
各种属性,如设备类型、供应商ID、产品ID、设备版本、配置数量、接
口数量、端点数量和类型等。
二、MFC环境下的USB通信基础
在MFC环境下进行USB通信,我们需要使用到Windows SDK提供的
USB API。主要涉及到的API函数包括CreateFile()、DeviceIoControl()、
CloseHandle()等。
1. CreateFile():用于打开一个USB设备,返回一个设备句柄。
2. DeviceIoControl():用于向USB设备发送控制请求,获取或设置设备
状态。
3. CloseHandle():用于关闭已经打开的USB设备。
三、枚举USB设备
在枚举USB设备之前,我们需要首先获取所有连接到系统的USB设备的
列表。这可以通过调用SetupDiGetClassDevs()函数实现。
以下是一个简单的示例代码:
cpp
GUID guid = GUID_DEVINTERFACE_USB_DEVICE;
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL,
DIGCF_PRESENT);
这段代码会返回一个设备信息集句柄hDevInfo,该句柄包含了所有当前
连接的USB设备的信息。
四、枚举USB描述符
获取到USB设备列表后,我们就可以开始枚举每个设备的描述符了。以
下是一个基本的枚举流程:
1. 获取设备描述符:通过调用DeviceIoControl()函数,向设备发送
IOCTL_USB_GET_DESCRIPTOR控制请求,获取设备描述符。
cpp
USB_DEVICE_DESCRIPTOR deviceDesc;
DWORD dwReturned;
BOOL bResult = DeviceIoControl(hDevice,
IOCTL_USB_GET_DESCRIPTOR, &deviceDesc, sizeof(deviceDesc),
&deviceDesc, sizeof(deviceDesc), &dwReturned, NULL);
2. 获取配置描述符:同样通过DeviceIoControl()函数,向设备发送
IOCTL_USB_GET_DESCRIPTOR控制请求,获取配置描述符。
cpp
USB_CONFIGURATION_DESCRIPTOR configDesc;
bResult = DeviceIoControl(hDevice, IOCTL_USB_GET_DESCRIPTOR,
&configDesc, sizeof(configDesc), &configDesc, sizeof(configDesc),
&dwReturned, NULL);
3. 获取接口和端点描述符:对于每个配置,都需要获取其包含的所有接口
和端点的描述符。这同样通过DeviceIoControl()函数实现。
cpp
USB_INTERFACE_DESCRIPTOR interfaceDesc;
bResult = DeviceIoControl(hDevice, IOCTL_USB_GET_DESCRIPTOR,
&interfaceDesc, sizeof(interfaceDesc), &interfaceDesc,
sizeof(interfaceDesc), &dwReturned, NULL);
USB_ENDPOINT_DESCRIPTOR endpointDesc;
bResult = DeviceIoControl(hDevice, IOCTL_USB_GET_DESCRIPTOR,
&endpointDesc, sizeof(endpointDesc), &endpointDesc,
sizeof(endpointDesc), &dwReturned, NULL);
以上就是使用MFC框架枚举USB描述符的基本步骤。需要注意的是,实
际操作中可能需要处理各种错误情况,并且不同类型的USB设备可能具
有不同的描述符结构和内容,因此在编写代码时需要根据具体设备情况进
行适当的调整和优化。


发布评论