C#编写的自动查找USB HID设备并传输数据,运行自动枚举全部USB HID 设备,从列表中选择并点击连接即可接收数据到PC端,支持win10系统,已测试。
部分源码:
/// <summary> /// 获取所有连接HID的设备 /// </summary> /// <param name="deviceList">返回所有连接HID的设备</param> private void GetDeviceList(ref List<string> deviceList) { Guid HIDGuid = Guid.Empty; windowsApi.GetDeviceGuid(ref HIDGuid);//获取HID的全局GUID IntPtr HIDInfoSet = windowsApi.GetClassDevOfHandle(HIDGuid);//获取包含所有HID接口信息集合的句柄 if (HIDInfoSet != IntPtr.Zero) { SP_DEVICE_INTERFACE_DATA interfaceInfo = new SP_DEVICE_INTERFACE_DATA(); interfaceInfo.cbSize = Marshal.SizeOf(interfaceInfo); //检测集合的每个接口 for (uint index = 0; index < MAX_USB_DEVICES; index++) { //获取接口信息 if (!windowsApi.GetEnumDeviceInterfaces(HIDInfoSet, ref HIDGuid, index, ref interfaceInfo)) continue; int buffsize=0; //获取接口详细信息;第一次读取错误,但可取得信息缓冲区的大小 windowsApi.GetDeviceInterfaceDetail(HIDInfoSet,ref interfaceInfo,IntPtr.Zero, ref buffsize); //接受缓冲 IntPtr pDetail = Marshal.AllocHGlobal(buffsize); SP_DEVICE_INTERFACE_DETAIL_DATA detail = new WindowsAPI.SP_DEVICE_INTERFACE_DETAIL_DATA(); detail.cbSize = Marshal.SizeOf(typeof(USBHIDControl.WindowsAPI.SP_DEVICE_INTERFACE_DETAIL_DATA)); Marshal.StructureToPtr(detail, pDetail, false); if (windowsApi.GetDeviceInterfaceDetail(HIDInfoSet, ref interfaceInfo, pDetail, ref buffsize))//第二次读取接口详细信息 deviceList.Add(Marshal.PtrToStringAuto((IntPtr)((int)pDetail + 4))); Marshal.FreeHGlobal(pDetail); } } //删除设备信息并释放内存 windowsApi.DestroyDeviceInfoList(HIDInfoSet); }