用SetDi系列api获得所有usb设备

本文介绍如何使用Setupapi.h等头文件来枚举USB设备,并通过多种API获取设备属性和服务名。此外还介绍了如何利用CM_Get_Device_ID等函数获取设备ID及状态,以及如何对设备进行停用或启用操作。
AI助手已提取文章相关产品:

首先是要引入头文件:

#include <Setupapi.h>//

#include "usbiodef.h"//包含枚举usb设备所需要的guid

#include <cfgmgr32.h>

#include <devguid.h>

#pragma comment(lib, "Setupapi.lib") //导入lib

//获得所有sub设备的集合

m_hDevInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, DIGCF_DEVICEINTERFACE/* | DIGCF_PRESENT*/);
//m_hDevInfo = SetupDiGetClassDevs(NULL, _T("USB"), NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);

这两种方式是有区别的,第一种只能获得所有的外部设备,第二种可以获得包括usb总线在内的所有sub设备,最后一个参数如果指定DIGCF_PRESENT,则返回的只有当前可用的设备,否则返回全部。

然后用SetupDiEnumDeviceInfo(m_hDevInfo, dwIndex, &m_DevInfoData) 函数依次枚举所有的设备,SetupDiGetDeviceRegistryProperty(m_hDevInfo,&m_DevInfoData,SPDRP_SERVICE,&DataType,(byte*)szDeviceService,_countof(szDeviceService),&BufferSize) 获得你想要的设备的属性值,然后比较对应的属性值,可以判断出当前枚举的设备是否为你想要的设备,如果是,则进行你想要的操作。

CM_Get_Device_ID(m_DevInfoData.DevInst, szDeviceID, BufferSize , 0) 获取设备的ID,然后通过id用CM_Get_DevNode_Status(&nStatus, &Problem, m_DevInfoData.DevInst, 0)获取对应设备的状态,包括是否可用,是否已经被移去等。

如果你想要停用或者启用设备,可以用SetupDiSetClassInstallParams和SetupDiCallClassInstaller实现。顺便提醒一句,某些设备是存在父子关系的,你如果把父设备停了,子设备当然也用不了了,可以用CM_Get_Parent和CM_Get_Child分别获得设备的父系和子代。

用完之后别忘了用SetupDiDestroyDeviceInfoList释放设备集合。

 

 

 

 

您可能感兴趣的与本文相关内容

以下是使用Robot Studio生成9位数字信号跑马灯的一般方法: ### 1. 新建或打开项目 在Robot Studio中,新建一个项目或者打开已有的项目,确保项目中包含机器人模型和相关的IO配置。 ### 2. 配置数字输出信号 在Robot Studio的“建模”选项卡中,找到“信号”部分,添加9个数字输出信号,分别命名为`DO1` - `DO9`,用于控制跑马灯的9个灯的亮灭状态。 ### 3. 创建RAPID程序 在Robot Studio中,切换到“编程与调试”选项卡,创建一个新的RAPID程序模块。以下是一个简单的RAPID程序示例,用于实现9位数字信号跑马灯效果: ```python MODULE MarqueeLight PROC main() VAR num i; WHILE TRUE DO FOR i FROM 1 TO 9 DO ResetAllOutputs(); SetDI(i); WaitTime 0.2; ENDFOR ENDWHILE ENDPROC PROC ResetAllOutputs() Reset DO1; Reset DO2; Reset DO3; Reset DO4; Reset DO5; Reset DO6; Reset DO7; Reset DO8; Reset DO9; ENDPROC PROC SetDI(num index) IF index = 1 THEN Set DO1; ELSEIF index = 2 THEN Set DO2; ELSEIF index = 3 THEN Set DO3; ELSEIF index = 4 THEN Set DO4; ELSEIF index = 5 THEN Set DO5; ELSEIF index = 6 THEN Set DO6; ELSEIF index = 7 THEN Set DO7; ELSEIF index = 8 THEN Set DO8; ELSEIF index = 9 THEN Set DO9; ENDIF ENDPROC ENDMODULE ``` ### 4. 程序解释 - `main` 程序:使用一个无限循环 `WHILE TRUE DO` 来持续运行跑马灯效果。在每次循环中,使用 `FOR` 循环从1到9依次点亮每个灯。 - `ResetAllOutputs` 程序:用于将所有9个数字输出信号重置为低电平,即熄灭所有灯。 - `SetDI` 程序:根据传入的索引值,将对应的数字输出信号设置为高电平,即点亮对应的灯。 ### 5. 运行程序 将编写好的RAPID程序下载到机器人控制器中,并在Robot Studio的“运行”选项卡中启动程序。此时,9位数字信号跑马灯效果应该会开始运行,每个灯依次点亮,间隔时间为0.2秒。 ### 注意事项 - 确保机器人控制器与实际的IO设备正确连接,并且数字输出信号的地址与实际硬件配置一致。 - 可以根据需要调整 `WaitTime` 的值来改变跑马灯的速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值