在工程属性-->链接器-->添加以下库

open 打开,close 关闭,打开后将获得reader 与writer 的handle,分别进行读写即可

#pragma once

#ifdef __cplusplus
extern "C" {
#endif // This file is in the Windows DDK available from Microsoft.
#include "hidsdi.h"
#include <setupapi.h>
#include <dbt.h>
#include <setupapi.h> int myUsbDeviceOpen(HANDLE *handle,HANDLE *hReader,HANDLE *hWriter, WORD wVID, WORD wPID);
void myUsbDeviceClose(HANDLE *handle,HANDLE *hreader,HANDLE *writer);
int myUsbDeviceWrite(HANDLE handle, LPCVOID lpBuffer, DWORD dwSize);
int myUsbDeviceRead(HANDLE handle, LPVOID lpBuffer, DWORD dwSize); #ifdef __cplusplus
}
#endif
#include "stdafx.h"
#include "myUSB_HID.h" #ifdef __cplusplus
extern "C" {
#endif HIDP_CAPS Capabilities;
PSP_INTERFACE_DEVICE_DETAIL_DATA HidFunctionClassData = NULL;
int myUsbDeviceOpen(HANDLE *handle,HANDLE *hReader,HANDLE *hWriter, WORD wVID, WORD wPID)
{
HANDLE hd;
HANDLE reader;
HANDLE writer;
BOOL bRet = FALSE;
GUID hidGuid;
HDEVINFO hardwareDeviceInfo;
SP_INTERFACE_DEVICE_DATA deviceInfoData;
ULONG predictedLength = ;
ULONG requiredLength = ;
PHIDP_PREPARSED_DATA PreparsedData;
hd = *handle;
*handle = NULL;
CloseHandle(hd);
hd = INVALID_HANDLE_VALUE;
deviceInfoData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);
HidD_GetHidGuid(&hidGuid);
hardwareDeviceInfo = SetupDiGetClassDevs(&hidGuid, NULL, NULL, (DIGCF_PRESENT|DIGCF_DEVICEINTERFACE));
for (int i=; i<; i++)
{
if (!SetupDiEnumDeviceInterfaces(hardwareDeviceInfo, , &hidGuid, i, &deviceInfoData))
continue;
SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfo, &deviceInfoData, NULL, , &requiredLength, NULL);
predictedLength = requiredLength;
HidFunctionClassData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);
if (!HidFunctionClassData)
continue;
HidFunctionClassData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
requiredLength = ;
if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfo, &deviceInfoData, HidFunctionClassData, predictedLength, &requiredLength, NULL))
continue;
hd = CreateFile (HidFunctionClassData->DevicePath, , FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING, , NULL);//FILE_SHARE_READ|FILE_SHARE_WRITE
if (hd != INVALID_HANDLE_VALUE)
{
HIDD_ATTRIBUTES attri;
HidD_GetAttributes(hd, &attri);
if ((attri.VendorID == wVID) &&
(attri.ProductID == wPID))
{
writer=CreateFile (HidFunctionClassData->DevicePath, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING, , NULL);
reader=CreateFile(HidFunctionClassData->DevicePath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,,NULL);
HidD_GetPreparsedData(hd,&PreparsedData);
HidP_GetCaps(PreparsedData,&Capabilities);
bRet = TRUE;
break;
}
CloseHandle(hd);
hd = INVALID_HANDLE_VALUE;
}
free(HidFunctionClassData);
}
SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);
*handle= hd;
*hReader= reader;
*hWriter = writer;
return bRet;
}
void myUsbDeviceClose(HANDLE *handle,HANDLE *hreader,HANDLE *writer)
{
CloseHandle(*hreader);
*hreader = INVALID_HANDLE_VALUE;
CloseHandle(*writer);
*writer = INVALID_HANDLE_VALUE;
CloseHandle(*handle);
*handle = INVALID_HANDLE_VALUE;
if(HidFunctionClassData!=NULL)
{
free(HidFunctionClassData);
HidFunctionClassData = NULL;
}
}
int myUsbDeviceWrite(HANDLE handle, LPCVOID lpBuffer, DWORD dwSize)
{
BYTE wBuffer[] = {};
DWORD dwRet = ;
BOOL bRet;
wBuffer[] = 0x00;
wBuffer[] = (unsigned char)dwSize;
memcpy(&wBuffer[], lpBuffer, min(Capabilities.OutputReportByteLength, dwSize));
bRet = WriteFile(handle, wBuffer, Capabilities.OutputReportByteLength, &dwRet, NULL);
return bRet;
} int myUsbDeviceRead(HANDLE handle, LPVOID lpBuffer, DWORD dwSize)
{
BYTE rBuffer[] = {};
DWORD dwRet;
BOOL bRet;
rBuffer[] = 0x00;
bRet = ReadFile(handle, rBuffer, Capabilities.InputReportByteLength, &dwRet, NULL);
memcpy(lpBuffer, &rBuffer[], min(rBuffer[], dwSize));
return bRet;
} #ifdef __cplusplus
}
#endif

USB_HID读写上位机VC++的更多相关文章

  1. C++ MFC实现基于RFID读写器的上位机软件

    C++ MFC实现基于RFID读写器的上位机软件 该博客涉及的完整工程托管在https://github.com/Wsine/UpperMonitor,觉得好请给个Star (/▽\=) 运行和测试环 ...

  2. vc++MFC开发上位机程序

    用vc++MFC开发过不少跟单片机通讯的上位机程序了.搞懂了MFC架构,开发还是很快的,与底层单片机程序通讯,可以用串口.usb.网络.短信形式.串口现在用的越来越少了,一般电脑跟单片机在一块,使用串 ...

  3. VC++编写简单串口上位机程序

    VC++编写简单串口上位机程序   转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信 ...

  4. LPC1768IAP(详解,有上位机)

    之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容) 首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他 ...

  5. CY7C68013 USB接口相机开发记录 - 第四天:上位机编写1

    前面学习了USB相机硬件固件.设备驱动,可以实现USB设备识别.数据发送的功能.然后,非常重要的一部分,USB设备发出的数据,我要怎么接受,怎么查看发送的数据是否是正确的.网上百度了下,大部分人都使用 ...

  6. 倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码

    倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码 本次测试需要环境: VS2013,TwinCAT3(本人版本TC31-Full-Setup.3.1.4018.16) 代 ...

  7. USBCAN的使用和上位机开发(MFC)

    USBCAN使用手册 参见:https://blog.51cto.com/12572800/2062839 1. USB CAN软件安装与硬件接线 USB CAN是常用的CAN测试工具.它的软件资料存 ...

  8. 周立功USBCAN-II 上位机开发(MFC)

    使用的USB转CAN的设备是周立功的USBCAN-II,在购买的时候,会有上位机二次开发的库文件.例程和API文档等材料,可以参考. 1.库函数的调用 首先,把库函数文件都放在工作目录下.库函数文件总 ...

  9. C# 实现自定义的USB设备与上位机进行通信(上位机部分)

    因为以前没用过USB,对USB也不了解,于是上网查了很多资料,不过网上的资料都是零零散散,不清不楚的,于是我自己总结了一下,下面几个链接是网上这么多零散资料里,我觉得比较有参考意义的. USB设备连接 ...

随机推荐

  1. jQuery_mobile页面跳转事件学习

      <html>     <head>         <meta http-equiv="Content-Type" content="t ...

  2. chorme浏览器调试Android设备

    Android设备开启开发者模式,并打开USB调试: 接着在Android设备上运行项目 在chrome浏览器打开F12: 在Remote devices里即可调试页面. ! 一般需要FQ

  3. 定位框一闪而过 iOS Swift

    需求:获取经纬度. 方案:我自定义了一个类模块CLLocationModule.swift 备注以下代码里 let IS_IOS8 = (UIDevice.currentDevice().system ...

  4. maven管理本地jar包注意事项

    今天lucene中集成第三方中文分词器IKAnalyzer的时候遇到了相似的问题:lucene版本4.9.IKAnalyzer版本2012FF_hf1 直接去maven仓库下载,pom配置如下: &l ...

  5. loss function

    什么是loss?   loss: loss是我们用来对模型满意程度的指标.loss设计的原则是:模型越好loss越低,模型越差loss越高,但也有过拟合的情况.   loss function: 在分 ...

  6. Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

    前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然使用上一季的的项目背景(系列地址http://www.cnblogs.com/fzrain/p/34 ...

  7. [原创] Delphi小工具(Windows资源管理器右键菜单扩展)

    两个小工具 1. 项目临时文件清理 2. Android Ndk 编译 c/c++ jni 源码工具. 下载后,点击Reg.bat就可以完成注册安装.不需要时点击 UnReg.Bat 就可以删除菜单. ...

  8. MD5工具类,提供字符串MD5加密、文件MD5值获取(校验)功能

    MD5工具类,提供字符串MD5加密(校验).文件MD5值获取(校验)功能 : package com.yzu.utils; import java.io.File; import java.io.Fi ...

  9. 【学习笔记】Servlet的配置

    为了让Servlet能响应用户的请求,需要将Servlet配置在Web应用中. 从Servlet3.0开始,配置Servlet有两种方式: l 在Servlet类中使用@WebServlet Anno ...

  10. HTML5 canvas学习笔记(一)

    canvas是HTML5中新增的标签,下面是各浏览器的支持程度: canvas的默认大小为:宽-300px,高-150px(注意:画布的大小作为canvas标签的行内样式设置,而且是没有“px”单位的 ...