C#+访问USB(HID)设备

2026/1/20 9:12:36

C# 访问USB(HID)设备 二话不说,直接给代码,如果您真想做这方面的东西,还是稍微研究下,没有现成的好类用,就需要自己了解其原理

//以下是调用windows的API的函数 //获得GUID

[DllImport(\

public static extern void HidD_GetHidGuid(ref Guid HidGuid); Guid guidHID = Guid.Empty;

//过滤设备,获取需要的设备

[DllImport(\

public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, uint Enumerator, IntPtr HwndParent, DIGCF Flags); IntPtr hDevInfo;

//获取设备,true获取到

[DllImport(\

public static extern Boolean SetupDiEnumDeviceInterfaces(IntPtr hDevInfo, IntPtr devInfo, ref Guid interfaceClassGuid, UInt32 memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData);

public struct SP_DEVICE_INTERFACE_DATA {

public int cbSize ;

public Guid interfaceClassGuid; public int flags; public int reserved; }

// 获取接口的详细信息 必须调用两次 第1次返回长度 第2次获取数据 [DllImport(\

private static extern bool SetupDiGetDeviceInterfaceDetail(IntPtr deviceInfoSet, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, IntPtr deviceInterfaceDetailData,

int deviceInterfaceDetailDataSize, ref int requiredSize, SP_DEVINFO_DATA deviceInfoData);

[StructLayout(LayoutKind.Sequential)] public class SP_DEVINFO_DATA {

public int cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); public Guid classGuid = Guid.Empty; // temp public int devInst = 0; // dumy public int reserved = 0; }

[StructLayout(LayoutKind.Sequential, Pack = 2)] internal struct SP_DEVICE_INTERFACE_DETAIL_DATA

{

internal int cbSize;

internal short devicePath; }

public enum DIGCF {

DIGCF_DEFAULT = 0x1, DIGCF_PRESENT = 0x2, DIGCF_ALLCLASSES = 0x4, DIGCF_PROFILE = 0x8,

DIGCF_DEVICEINTERFACE = 0x10 }

//获取设备文件

[DllImport(\ private static extern int CreateFile(

string lpFileName, // file name uint dwDesiredAccess, // access mode uint dwShareMode, // share mode uint lpSecurityAttributes, // SD

uint dwCreationDisposition, // how to create uint dwFlagsAndAttributes, // file attributes

uint hTemplateFile // handle to template file );

//读取设备文件

[DllImport(\ private static extern bool ReadFile (

IntPtr hFile, byte[] lpBuffer,

uint nNumberOfBytesToRead, ref uint lpNumberOfBytesRead, IntPtr lpOverlapped );

//释放设备

[DllImport(\

static public extern bool HidD_FreePreparsedData(ref IntPtr PreparsedData); //关闭访问设备句柄,结束进程的时候把这个加上保险点 [DllImport(\

static public extern int CloseHandle(int hObject);

接下来是访问设备的代码

//代码暂时没有整理,传入参数是设备序号,

//有些USB设备其实有很多HID设备,就是一个接口上有几个设备,这个时候需要 //用index++来逐个循环,直到获取设备返回false后,跳出去,把获取的设备 //路径全记录下来就好了,我这里知道具体设备号,所以没有循环,浪费我时间

//定于句柄序号和一些参数,具体可以去网上找这些API的参数说明,后文我看能不能把资料也写上去

int HidHandle = -1;

public const uint GENERIC_READ = 0x80000000; public const uint GENERIC_WRITE = 0x40000000; public const uint FILE_SHARE_READ= 0x00000001; public const uint FILE_SHARE_WRITE = 0x00000002; public const int OPEN_EXISTING = 3;

private void UsBMethod(int index) {

HidD_GetHidGuid(ref guidHID);

hDevInfo = SetupDiGetClassDevs(ref guidHID, 0, IntPtr.Zero, DIGCF.DIGCF_PRESENT | DIGCF.DIGCF_DEVICEINTERFACE); int bufferSize = 0;

ArrayList HIDUSBAddress = new ArrayList();

//while (true) //{

//获取设备,true获取到 SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();

DeviceInterfaceData.cbSize = Marshal.SizeOf(DeviceInterfaceData); //for (int i = 0; i < 3; i++) //{

bool result = SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref guidHID, (UInt32)index, ref DeviceInterfaceData); //}

//第一次调用出错,但可以返回正确的Size

SP_DEVINFO_DATA strtInterfaceData = new SP_DEVINFO_DATA();

result = SetupDiGetDeviceInterfaceDetail(hDevInfo, ref DeviceInterfaceData, IntPtr.Zero, 0, ref bufferSize, strtInterfaceData);

//第二次调用传递返回值,调用即可成功

IntPtr detailDataBuffer = Marshal.AllocHGlobal(bufferSize); SP_DEVICE_INTERFACE_DETAIL_DATA detailData = new SP_DEVICE_INTERFACE_DETAIL_DATA();

detailData.cbSize = Marshal.SizeOf(typeof(SP_DEVICE_INTERFACE_DETAIL_DATA));

Marshal.StructureToPtr(detailData, detailDataBuffer, false);

result = SetupDiGetDeviceInterfaceDetail(hDevInfo, ref DeviceInterfaceData, detailDataBuffer, bufferSize, ref bufferSize, strtInterfaceData); if (result == false) {

//break; }

//获取设备路径访

IntPtr pdevicePathName = (IntPtr)((int)detailDataBuffer + 4);

string devicePathName = Marshal.PtrToStringAuto(pdevicePathName); HIDUSBAddress.Add(devicePathName); //index++; //break; //}

//连接设备文件

int aa = CT_CreateFile(devicePathName); bool bb = USBDataRead(HidHandle); }

//建立和设备的连接

public unsafe int CT_CreateFile(string DeviceName) {

HidHandle = CreateFile( DeviceName,

GENERIC_READ,// | GENERIC_WRITE,//读写,或者一起

FILE_SHARE_READ,// | FILE_SHARE_WRITE,//共享读写,或者一起 0,

OPEN_EXISTING, 0, 0);

if (HidHandle == -1) {

return 0; } else {

return 1; } }

//根据CreateFile拿到的设备handle访问文件,并返回数据 public unsafe bool USBDataRead(int handle) {


C#+访问USB(HID)设备.doc 将本文的Word文档下载到电脑
搜索更多关于: C#+访问USB(HID)设备 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219