c++读取本地所有USB设备的所有信息(包括串行设备)

该博客主要介绍了如何利用C++编程语言读取本地USB设备的相关信息,包括硬件ID、PID、VID以及设备名称。文中展示了头文件和cpp文件的代码实现,并分享了运行结果,指出某些USB设备信息不全可能是虚拟设备或自开发硬件未正确标识。
摘要由CSDN通过智能技术生成

读取的信息很多,但是我目前只需要硬件ID、pid、vid、设备名称:

头文件代码如下:

#include <windows.h>
#include <setupapi.h>
#include <Cfgmgr32.h>
#include <iostream>
#include <vector>
#include <string>
#include <initguid.h>
#include <Usbiodef.h>
#include <Usb100.h>
#include <Usbioctl.h>

/* 表示USB设备的设备结构 */
struct Device
{
    std::string strDevPath;                //设备路径
    USB_DEVICE_DESCRIPTOR stDevDescriptor; //设备描述符
    std::string manufacture;               //制造商名称
    std::string serial;                    //序列号
    std::string product;                   //产品名称
};

class CFindUsbDevices 
{
    std::wstring GetHubPath(unsigned long iDevice);
    long GetPortByLocation(const std::wstring& strLocation);
    std::string GetStrDescriptor(std::wstring strHubPath, ULONG port, USHORT index);
    USB_DEVICE_DESCRIPTOR GetDevDescriptor(std::wstring strHubPath, ULONG port);

public:
    std::vector<Device*> GetDevices(GUID* guid);
};

cpp文件代码:

#include "FindUsbDevices.h"

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

/**
* 获取中心路径对象
* param实例集线器的设备实例
* return与提供的设备实例关联的集线器的设备路径
*/
std::wstring CFindUsbDevices::GetHubPath(unsigned long iDevice)
{
    std::wstring strHubPath;
    DWORD iMember = 0;
    SP_DEVINFO_DATA stDeviceInfo;
    SP_DEVICE_INTERFACE_DATA stDeviceInter;
    PSP_DEVICE_INTERFACE_DETAIL_DATA stDeviceDetail;

    DWORD Flags = DIGCF_PRESENT | DIGCF_DEVICEINTERFACE;
    HDEVINFO pDeviceInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_USB_HUB, NULL, NULL, Flags);
    if (INVALID_HANDLE_VALUE != pDeviceInfo) {
        while (ERROR_NO_MORE_ITEMS != GetLastError()) {
            stDeviceInfo.cbSize = sizeof(SP_DEVINFO_DATA);

            auto bSutup = SetupDiEnumDeviceInfo(pDeviceInfo, iMember, &stDeviceInfo);
            if(bSutup && stDeviceInfo.DevInst == iDevice) {
                stDeviceInter.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

                auto bDiEnum = SetupDiEnumDeviceInterfaces(pDeviceInfo, NULL, (LPGUID)&
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
现在USB设备却很多,因此对USB设备查找与读写就必不可少了。但是能找到关于USB读写的资料很少。这里使用VC++示范了一些获得USB信息的方法。 一、枚举USB设备   通过枚举USB控制器->枚举此控制器上的USB HUB->枚举HUB的各个端口->获得设备信息。 枚举控制器: wsprintf(HCName, "\\\\.\\HCD%d", HCNum); hHCDev = CreateFile(HCName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);   计算机上的USB主控制器以HCD1,HCD2等命名。通过控制器名称,使用CCreateFile 打开它。使用DeviceIoControl即可得到其驱动程序名,以及与它连接的HUB的名称。用CCreateFile打开HUB,获得连接信息。再枚举HUB的各个端口即可获得连接的设备信息。 二、枚举HID设备   HID设备是微软定义的标准人机接口规范。比如USB鼠标,USB游戏手柄等。不用查找具体设备的GUID,使用API HidD_GetHidGuid(&guidHID)即可得到GUID。有了GUID通过API SetupDiEnumDeviceInterfaces可获得是否有设备连接。如果此类设备连接通过SetupDiGetDeviceInterfaceDetail获得它的设备路径信息。使用CCreateFile 打开它,通过HidD_GetAttributes获得其基本属性信息。使用DeviceIoControl可以获得更详细的属性。在本代码中如果计算机上插有USB游戏手柄,可获得其信息。但不知道为什么xp下却不能获得USB鼠标的信息。 三 枚举U盘   先用GetDriveType API获得设备的类型,若类型为REMOVABLE(当然有些大容量U盘可能报告为FIXED,那就需要其他方法来确定了),即可能是U盘。用CCreateFile 打开之后,再用IOCTL_STORAGE_QUERY_PROPERTY为参数的DeviceIoControl来获得其属性。 四、结束语   示例工程在winxp+xpDDK+VC6下编译通过。USB设备种类比较多,也比较特殊,不同厂商的硬件不同,控制软件也不尽相同(我想主要是ICTL码不同,也不容易查到)。使得访问USB口的设备不象串口并口那么方便。这个例程只是展示了访问的基本方法。其中还有些问题还没有解决,发出来希望大家解决之后能通知我或者发表出来。 参考了USBPort,USBview等代码,一并致谢。
### 回答1: C USB口的读写速率测试是用来衡量C USB口在数据传输过程中的速度。USB(通用串行总线)是一种在计算机和外部设备之间传输数据的标准接口。C USBUSB的第三个主要版本,它在传输速度和功率管理方面有显著的改进。 进行C USB口读写速率测试可以通过连接一个可测量读写速度的设备,例如闪存驱动器或硬盘驱动器。在测试过程中,使用一定量的数据进行读写操作,并记录完成这些操作所需的时间。 收集的数据可以用来计算C USB口的读取速率和写入速率。读取速率是指从设备读取数据的速度,写入速率是指将数据写入设备的速度。通常以每秒钟传输的数据量来表示。 测试结果可能会受到多种因素的影响,包括设备本身的性能、使用的数据传输协议、连接的USB端口类型等。因此,进行多次测试并取平均值可以得到更准确的结果。 可以使用各种工具和软件来进行C USB口读写速率测试,比如CrystalDiskMark、HD Tune等。这些工具提供了简单易用的界面,可以帮助用户进行测试,并显示测试结果。 基于测试结果,可以了解C USB口的性能以及其在数据传输中的表现。如果读写速率达到或接近C USB口的理论极限,即说明C USB口的性能非常出色。但如果读写速率远低于理论极限,则可能表明存在性能瓶颈,可能需要进行进一步的故障排除或升级硬件设备。 总之,C USB口的读写速率测试是评估C USB口性能的重要手段,可以帮助用户了解C USB口在数据传输中的表现和潜在的性能问题。 ### 回答2: C USB口的读写速率是指通过C USB口传输数据的速度。通过进行读写速率测试,我们可以评估C USB口在实际使用中的性能表现。 在进行读写速率测试之前,我们需要一台支持C USB接口的设备,并在设备中连接一个具有高速传输能力的存储设备,如USB 3.0闪存盘。同时,我们还需要一款专业的测试工具,如CrystalDiskMark或者ATTO Disk Benchmark。 首先,我们将C USB接口与存储设备相连接,并确保设备正常工作。然后,我们打开测试工具,并选择相应的存储设备进行测试。在测试过程中,工具会自动进行一系列的读写操作,并记录下每个操作的传输速度。 完成测试后,我们可以得到C USB口的读写速率结果。这些结果通常以每秒传输的数据量来表示,如以MB/s或GB/s为单位。这些结果可以帮助我们了解C USB口的性能,并对其在实际使用中的数据传输能力有更清晰的认识。 需要注意的是,C USB口的读写速率受到多个因素的影响,包括设备本身的性能、传输的数据类型以及连接线和驱动程序的质量等。所以,在进行测试时,我们应该尽量保持测试环境的稳定,并与其他设备的性能进行对比,以更准确地评估C USB口的性能。 总之,通过进行C USB口的读写速率测试,我们可以了解到其在实际使用中的传输能力,并为我们的数据传输提供参考依据。 ### 回答3: c USB口读写速率测试是对计算机上的USB接口的数据传输速度进行测量的过程。通过这个测试,我们可以了解USB接口的性能和传输效率。通常,USB接口的读写速率是指数据从计算机存储设备(如硬盘、固态硬盘、U盘等)传输到USB设备(如手机、相机、外部硬盘等)或从USB设备传输到计算机存储设备的速度。 测试USB口的读写速率有多种方法,常见的有以下几种: 1. 使用第三方软件进行测试:可以使用一些专门的测试软件,例如CrystalDiskMark、HD Tune等,在测试前,需要将计算机与USB设备连接,然后选择相应的测试选项进行测试。测试结果将显示出USB接口的读写速率。 2. 复制大文件进行测试:通过复制一个较大的文件(如几个GB的电影文件)来测试USB口的读写速率。通过观察文件复制的用时,即可得到USB口的读写速率。 3. 使用设备管理器进行测试:在Windows系统中,可以打开设备管理器,找到并右键点击USB控制器,选择"属性",在"详细信息"中找到对应的"速度"属性,即可查看USB口的传输速度。请注意,这里显示的是理论速度,实际速度会受到多种因素的影响。 需要注意的是,USB接口的读写速率还受到其他因素的影响,如USB设备本身的性能、计算机硬件配置、USB接口的版本等。因此,测试结果仅供参考,实际使用中可能会略有差异。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值