win10系统 已知USB设备的PID和VID,如何枚举USB设备,然后打开,读写,最后关闭设备。
时间: 2024-05-13 13:15:56 浏览: 32
可以使用Windows API函数来实现枚举、打开、读写和关闭USB设备。
以下是示例代码:
```c++
#include <Windows.h>
#include <SetupAPI.h>
#include <devguid.h>
#include <iostream>
int main()
{
// 枚举指定VID和PID的USB设备
GUID guidDevInterface = GUID_DEVINTERFACE_USB_DEVICE;
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidDevInterface, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
std::cerr << "Failed to get device information set.\n";
return 1;
}
SP_DEVINFO_DATA devInfoData = { 0 };
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
DWORD dwMemberIndex = 0;
BOOL bFoundDevice = FALSE;
while (SetupDiEnumDeviceInfo(hDevInfo, dwMemberIndex, &devInfoData))
{
dwMemberIndex++;
// 获取设备的硬件ID
WCHAR szHardwareId[MAX_DEVICE_ID_LEN] = { 0 };
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &devInfoData, SPDRP_HARDWAREID, NULL, (BYTE*)szHardwareId,
sizeof(szHardwareId), NULL))
{
if (wcsstr(szHardwareId, L"VID_XXXX&PID_XXXX") != NULL)
{
std::wcout << L"Found matching device with hardware ID: " << szHardwareId << std::endl;
// 打开设备
HANDLE hDevice = CreateFile(L"\\\\.\\USB#VID_XXXX&PID_XXXX#", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
std::cout << "Device opened successfully." << std::endl;
// 读写设备
DWORD dwBytesWritten = 0;
DWORD dwBytesRead = 0;
BYTE bufWrite[] = { 0x01 };
BYTE bufRead[64] = { 0 };
if (WriteFile(hDevice, bufWrite, sizeof(bufWrite), &dwBytesWritten, NULL) &&
ReadFile(hDevice, bufRead, sizeof(bufRead), &dwBytesRead, NULL))
{
std::cout << "Data written and read successfully." << std::endl;
}
else
{
std::cerr << "Failed to read/write data to device." << std::endl;
}
// 关闭设备
CloseHandle(hDevice);
}
else
{
std::cerr << "Failed to open device." << std::endl;
}
bFoundDevice = TRUE;
break;
}
}
}
if (!bFoundDevice)
{
std::cerr << "Matching device not found." << std::endl;
}
// 释放设备信息集合
SetupDiDestroyDeviceInfoList(hDevInfo);
return 0;
}
```
需要替换代码中的`VID_XXXX&PID_XXXX`为实际的VID和PID值。此外,需要在代码中添加相应的头文件和链接到相应的库文件。