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设备可能具

有不同的描述符结构和内容,因此在编写代码时需要根据具体设备情况进

行适当的调整和优化。