21xrx.com
2024-09-19 10:02:08 Thursday
登录
文章检索 我的文章 写文章
C++读取USB设备ID
2023-06-27 19:22:26 深夜i     --     --
- C++ - USB设备 - ID - 读取 - 设备驱动程序

C++是一个功能强大的编程语言,它可以用于在计算机上开发各种类型的应用程序,包括与USB设备通信的程序。当开发USB应用程序时,了解如何读取USB设备ID非常重要。在本文中,我们将介绍如何使用C++读取USB设备ID。

USB设备ID是指所有接入计算机的USB设备都有一个独特的标识符。每个USB设备ID都由厂商ID和产品ID组成。厂商ID是指设备制造商的唯一标识符,而产品ID是指设备的型号信息。

要读取USB设备ID,我们需要使用C++的库函数。在Windows操作系统中,我们可以使用SetupAPI和WinUSB库来操作USB设备和读取它们的ID。下面是使用C++和WinUSB库来读取USB设备ID的步骤:

1. 引入WinUSB库头文件和链接库文件。


# include <windows.h>

# include <Winusb.h>

# pragma comment (lib,"winusb.lib")

2. 定义WinUSB设备句柄和其他变量。


HANDLE hDevice = INVALID_HANDLE_VALUE;

WINUSB_INTERFACE_HANDLE hWinUSB = NULL;

UCHAR idBuffer[8] = {0};

GUID interfaceGUID = 0xed; //设备接口GUID,每个设备都有一个唯一的GUID

ULONG bytesTransferred = 0;

3. 枚举所有连接的USB设备,找到需要操作的设备的设备路径。


HDEVINFO hDevInfo;

SP_DEVICE_INTERFACE_DATA deviceInterfaceData;

ULONG deviceInterfaceDetailDataSize = 0;

PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL;

SP_DEVINFO_DATA devinfoData;

DWORD deviceIndex;

hDevInfo = SetupDiGetClassDevs(&interfaceGUID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);

deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

devinfoData.cbSize = sizeof(SP_DEVINFO_DATA);

deviceIndex = 0;

while (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &interfaceGUID, deviceIndex, &deviceInterfaceData)) {

  SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, NULL, 0, &deviceInterfaceDetailDataSize, &devinfoData);

  deviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)GlobalAlloc(GPTR, deviceInterfaceDetailDataSize);

  deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

  SetupDiGetDeviceInterfaceDetail(hDevInfo, &deviceInterfaceData, deviceInterfaceDetailData, deviceInterfaceDetailDataSize, &deviceInterfaceDetailDataSize, &devinfoData);

  if (deviceInterfaceDetailData != NULL && _tcscmp(deviceInterfaceDetailData->DevicePath, L"USB\\VID_xxxx&PID_xxxx\\xxxxxx&x&xxxx") == 0) {

    hDevice = CreateFile(deviceInterfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); //打开设备句柄

    break;

  }

  

  deviceIndex++;

}

4. 使用WinUSB库打开设备接口并读取设备ID。


if (hDevice != INVALID_HANDLE_VALUE) {

  if (WinUsb_Initialize(hDevice, &hWinUSB)) {

    WinUsb_ControlTransfer(hWinUSB, UsbVendorRequestType, UsbControlRequestNumber, UsbControlRequestValue, UsbControlRequestIndex, idBuffer, sizeof(idBuffer), &bytesTransferred, NULL); //发送控制传输

  }

  WinUsb_Free(hWinUSB);

  CloseHandle(hDevice);

}

这就是使用C++读取USB设备ID的全部步骤。通过使用WinUSB库,我们可以轻松地打开设备接口并发送控制传输,以读取设备ID。我们可以将这些代码添加到我们的USB应用程序中,以更好地控制和管理USB设备。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复