USB_HID读写上位机VC++

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

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 = 0;
    ULONG requiredLength = 0;
    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=0; i<128; i++)
    {
        if (!SetupDiEnumDeviceInterfaces(hardwareDeviceInfo, 0, &hidGuid, i, &deviceInfoData))
            continue;
        SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfo, &deviceInfoData, NULL, 0, &requiredLength, NULL);
        predictedLength = requiredLength;
        HidFunctionClassData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);
        if (!HidFunctionClassData)
            continue;
        HidFunctionClassData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
        requiredLength = 0;
        if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfo, &deviceInfoData, HidFunctionClassData, predictedLength, &requiredLength, NULL))
            continue;
        hd = CreateFile (HidFunctionClassData->DevicePath, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, (LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING, 0, 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, 0, NULL);
                reader=CreateFile(HidFunctionClassData->DevicePath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,0,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[1024] = {0};
    DWORD dwRet = 0;
    BOOL bRet;
    wBuffer[0] = 0x00;
    wBuffer[1] = (unsigned char)dwSize;
    memcpy(&wBuffer[2], 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[1024] = {0};
    DWORD dwRet;
    BOOL bRet;
    rBuffer[0] = 0x00;
    bRet = ReadFile(handle, rBuffer, Capabilities.InputReportByteLength, &dwRet, NULL);
    memcpy(lpBuffer, &rBuffer[1], min(rBuffer[0], dwSize));
    return bRet;
}

#ifdef __cplusplus
    }
#endif
时间: 2024-10-06 05:19:30

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

8.PMAC上位机-VC编程环境配置

前面讲的知识都是在PE-WIN32中操作的,都是针对PMAC下位机编程的,现在开始讲解PMAC上位机--PC端如何与PMAC通信:给PMAC发送控制信号及处理PMAC的中断响应.本文先说PMAC VC编程的环境配置. 1.文件夹结构 PMAC PC编程必须安装PComm32,安装完文件夹结构如下: Pmactest.exe用于在PAMC按完成后测试当前安装是否成功,PmacTest是该程序的源码 PCOMM32PRO.HLP是PComm32的编程帮助手册 VCTest和VBTest文件夹是上位机

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

转载: http://blog.sina.com.cn/s/articlelist_1809084904_0_1.html VC++编写简单串口上位机程序 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面.写上位机程序的编程语言.编译环境等不少,VB.C#.LABVIEW等等,我会的语言很 少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相 当蹩脚的C++写出了一个简单的串口上位机程序,分享一下

上位机简单串口类,VC串口类

我是在一家做硬件的的公司里面做软件开发工程师的,我做的软件大多是是编写软件通过串口去控制硬件,所以串口编程对于我来说是很重要的.串口编程之前一直使用的是自己写的简单串口(只有发送,没有接收)类,或者上网下的CSerialPort类(个人觉得不好用啊,互锁变量一堆,代码一开始还让人看不懂,对于上位机使用不合适).对于我做的上位机软件,其实使用串口只是需要顺序发送,接收数据无误就行了,不需要考虑太多东西.所以最近有点空,就自己再写了一个串口类(希望可以简单使用的,没有太高的要求的). (1)界面 界

温度传感器+I2C+串口+PC上位机(pyserial)例子

例子写的有点乱,主要是学习: 温度传感器DS18b20,E2PROM,I2C, 串口读写,PC上位机(pyserial)数据显示 SerialPort.py     PC串口上位机程序,可以设定上限报警温度 需要安装Python3以上,pyserial库,例子在Python3.4下写的. 上位机传给单片机上限报警温度后,单片机存入E2PROM, 单片机断电重启后,从E2PROM读取报警值. i2c.h             I2C总线读写和设定 lcd1602.h         lcd160

LPC1768IAP(详解,有上位机)

之前说了stm32的iap编程,今天天气真好,顺手就来说说lpc1788的iap编程(没看前面的请查看stm笔记下的内容) 首先是flash的算法,lpc1768并没有寄存器来让我们操作flash,他内置了iap的flash算法,在技术手册的525页有如下说明 其支持的iap命令有这些 这样我们就能够做出相关的flash读写借口呢(具体请查看lpc1768的技术手册) unsigned param_table[5];//传递参数列表 unsigned result_table[5];//返回结果

基于FPGA的测频系统+上位机

[1]本设计的要求: 利用FPGA实现频率计,要求2秒内测出外部频率,并且2秒更新一次值: 实现100MHz频率的测量: 测量结果通过串口921600bps发送给PC: 发送格式为:FFCB0176543210,其中FFCB01为帧头,76543210(即0x76543210)为频率值,数据在上位机中转换成十进制并用合适的单位(MHz.KHz.Hz)表示: 完善上位机. [2]现在就来说说我是如何实现上述条件的.对于第一个条件"2秒内测出频率并2秒更新一次",很明显这是连续.实时的测量

项目总结-上位机

概述 总结 明确目的 软件结构设计 软件页面的设计与实现 串口通信的实现 关于注释 一些需要注意的问题 评价 结果展示 软件打包 代码 概述: 前几天受朋友之托,给他们的项目写个上位机.有些经验分享给大家 项目要求是上位机收到通过串口发送的数据,根据数据显示空车位的数量. *最终上位机拥有的值得一谈的功能: 1.串口通信的相关设置 2.数据保存 3.界面随窗口缩放的实现 4.软件打包 5....然后就没有了 总结 1.明确目的 开始写软件之前首先明确目的,软件应该实行什么功能,然后设计界面,最后

USB工业摄像头设计之上位机

在工业相机中对摄像头要求较高,且采集的图像数据要求是源数据,未经过任何处理. 为了兼容xp.win7(32bit 64bit) 程序采用VS2008  MFC编制,参考网上一些应用. CYUSB驱动与CYAPI开发包以前68013上位机程序的编写过程中,应用程序端通过调用DeviceIoControl() API或CREATEPIPE() API与驱动进行交互,继而读写控制硬件设备,在新的68013A的驱动中采用了两种新的调用方法:第一种是继续使用DeviceIoControl()函数读写,不同

FX2LP CY7C68013A上位机应用程序开发笔记

---恢复内容开始--- 现在CYPRESS官网给出最新的安装包的驱动信息是cyusb3.inf/cyusb3.sys,之前的cyusb.inf/cyusb.sys已经不再使用. 旧版本的安装包为:Cy SuiteUSB3.4.7,新版本的为:CY3684 EZ-USB FX2LP Development Kit (Rev. B)或者CY3684 EZ-USB FX2LP DVK Setup那我们只需要看装新版的开发套件即可. 为了紧跟时尚潮流我们采用了新的驱动,从官网下载下来的安装目录应该是这