搞了三天,终于把windows的USB程序搞定了,虽然还存在一些问题,

mark一下方便以后使用。

#include <windows.h> //一定要加入该头文件
#include <iostream>extern "C"{
#include <hidsdi.h>
#include <setupapi.h>
#include <hidsdi.h>
}using namespace std;BOOL DeviceOpen(HANDLE&handle, WORD wVID, WORD wPID)
{BOOL bRet = FALSE;GUID hidGuid;HDEVINFO hardwareDeviceInfo;SP_INTERFACE_DEVICE_DATA deviceInfoData;PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;ULONG predictedLength = 0;ULONG requiredLength = 0;CloseHandle(handle);handle = 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;functionClassDeviceData =(PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);if (!functionClassDeviceData) continue;functionClassDeviceData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfo,&deviceInfoData, functionClassDeviceData, predictedLength,&requiredLength, NULL)) break;handle = CreateFile(functionClassDeviceData->DevicePath,GENERIC_READ|GENERIC_WRITE, 0, NULL,OPEN_EXISTING, 0, NULL);// cout <<"devicePath"<<functionClassDeviceData->DevicePath<<endl;if (handle != INVALID_HANDLE_VALUE){HIDD_ATTRIBUTES attri;HidD_GetAttributes(handle, &attri);if ((attri.VendorID == wVID) && (attri.ProductID == wPID)){          cout <<"handle="<<handle<<",err="<<GetLastError()<<endl;printf("%x,%x\n",attri.VendorID,attri.ProductID);bRet = TRUE;break;}CloseHandle(handle);handle = INVALID_HANDLE_VALUE;// cout <<attri.VendorID<<" "<<attri.ProductID<<" "<<attri.VendorID<<" "<<attri.VersionNumber<<endl;}}SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);return bRet;
}void DeviceClose(HANDLE &handle)
{CloseHandle(handle);handle = INVALID_HANDLE_VALUE;
}BOOL DeviceWrite(HANDLE &handle, LPCVOID lpBuffer, DWORD dwSize)
{if(handle==INVALID_HANDLE_VALUE){cout <<"DeviceWrite failed"<<endl;return 0;}BYTE rBuffer[64] = {0};DWORD dwRet;BOOL bRet;PHIDP_PREPARSED_DATA PreparsedData;HIDP_CAPS Capabilities;HidD_GetPreparsedData(handle,&PreparsedData);HidP_GetCaps(PreparsedData, &Capabilities);cout <<"Capabilities.OutputReportByteLength="<<Capabilities.OutputReportByteLength<<endl;rBuffer[0] = 0x0;  //第一个字节为report Id,一定需要
#if 0rBuffer[1] = 50;rBuffer[2] = 88;rBuffer[3] = 2;rBuffer[4] = 88;
#elsememcpy(rBuffer+1,lpBuffer,min(10,dwSize));
#endif//这里写的长度一定要是Capabilities.OutputReportByteLength,还不知道什么原因bRet = WriteFile(handle, rBuffer, Capabilities.OutputReportByteLength, &dwRet, NULL);cout <<"bRet="<<bRet<<" GetLastError="<<GetLastError()<<" dwRet="<<dwRet<<endl;return bRet;
}BOOL DeviceRead(HANDLE &handle, LPVOID lpBuffer, DWORD dwSize)
{if(handle==INVALID_HANDLE_VALUE){cout <<"DeviceWrite failed"<<endl;return 0;}BYTE rBuffer[128] = {0};DWORD dwRet;BOOL bRet;PHIDP_PREPARSED_DATA PreparsedData;HIDP_CAPS Capabilities;HidD_GetPreparsedData(handle,&PreparsedData);HidP_GetCaps(PreparsedData, &Capabilities);//memcpy(&wBuffer[2], lpBuffer, min(6, dwSize));COMMTIMEOUTS timeout;timeout.ReadIntervalTimeout = 0;timeout.ReadTotalTimeoutConstant = 0;timeout.ReadTotalTimeoutMultiplier = 1000;SetCommTimeouts(handle,&timeout);cout <<"timeout err="<<GetLastError()<<endl;cout <<"read Capabilities.OutputReportByteLength="<<Capabilities.OutputReportByteLength<<endl;//读的长度也一定要是Capabilities.OutputReportByteLengthbRet = ReadFile(handle, rBuffer, Capabilities.OutputReportByteLength, &dwRet, NULL);cout <<"bRet="<<bRet<<" GetLastError="<<GetLastError()<<" dwRet="<<dwRet<<endl;for (int i=0; i<dwRet; i++){printf("%x ",rBuffer[i]);}cout <<endl;// memcpy(lpBuffer, &rBuffer[1], min(7, dwSize));return bRet;
}int main(int argc, char* argv[])
{HANDLE handle=NULL;cout <<"handle="<<handle<<endl;//这两个参数的值能识别哪一个是你的设备if(DeviceOpen(handle,0x9219,0x1312)==FALSE){
//      cout <<"Device Open failed!"<<endl;   }cout <<"handle="<<handle<<endl;char data[10]={0};if(handle==INVALID_HANDLE_VALUE){cout <<"open device failed"<<endl;return 1;}data[0] = 50;data[1] = 88;data[2] = 2;data[3] = 88;DeviceWrite(handle,data,4);DeviceRead(handle,data,5);DeviceClose(handle);return 0;
}

Windows与USB的通信相关推荐

  1. 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题

    遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiNetwork/ht ...

  2. Android USB 串口通信

    公司要求安卓PAD对接一台Windows的设备,实现双向数据传输. 是通过Windows设备的一根数据线进行数据传输的,涉及到的技术就是USB转串口通信,网上讲原理的一大堆,我就不讲了,直接上demo ...

  3. CSR8675学习笔记:USB HID通信

    为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板[淘宝链接:思度科技CSR开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单号入 ...

  4. Windows下usb接口驱动技术(二)

    八.        Windows驱动程序模型 Windows环境下驱动程序共有三类,一类是VxD( Virtual Device Driver,虚拟设备驱动程序),起源于Windows 3.1 时代 ...

  5. Android Service创建USB HOST通信

    之前做了一个关于Android USB通信的Case,通过Android的USB总线给Zigbee供电,和板载的Zigbee(基于Zigbee的自组网)进行通信.要使用Android的USB Host ...

  6. USB | 通过PyUSB实现USB接口通信

    本文总结 - Update: 2022 / 10 / 19 USB | 通过PyUSB实现USB接口通信 Mark 参考链接 Mark 先mark,后面再更新 1. 参考链接 Windows环境下基于 ...

  7. Windows CE USB摄像头驱动编写

    作者:youngyi2006 转自:http://blog.csdn.net/youngyi2006/article/details/7731311 非常感谢下面两位高人 作者: Douglas Bo ...

  8. 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...

    RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...

  9. 进程在与Windows Process Activation Service通信时出现严重错误 w3wp.exe错误

    标题是两个问题  出现时间是一样的  先有进程在与Windows Process Activation Service通信时出现严重错误  然后事件查看器里就会出现w3wp.exe错误 问题的后果就是 ...

最新文章

  1. linux perl cpan 安装使用
  2. java改变this指向_$.on()方法和addEventListener改变this指向
  3. 银行推出一年存1万连着存5年,利率4.5%,能存吗?
  4. linux打包tar包命令,Linux压缩打包方法连载之一:tar命令
  5. Mysql导入大容量SQL文件数据问题
  6. 模板共享指针(shared_ptr)原理实现
  7. python跳出两层(多层)循环--使用标志量
  8. 为不干活的员工辩护,要小心
  9. 【愚公系列】2022年01月 Django商城项目14-用户中心-界面设计
  10. 考研高等数学张宇30讲笔记——第二讲 数列极限
  11. OpenCV-Python教程:阈值化(threshold,adaptiveThreshold)
  12. 浅谈企业IT技术运营中台
  13. RLS算法-公式初探
  14. IAR Embedded Workbench 将支持 RISC-V 太空级处理器 NOEL-V
  15. 百度自然语言接口调用
  16. 照片去雾怎么操作?学会这招就不用担心雾化了
  17. ios view改变重叠层次关系
  18. 在mysql中如何建立性别约束_在Access2010数据库中,要在表中建立“性别”字段,并按与要求用逻辑值表示,其数据类型应当是()_学小易找答案...
  19. python 实现自动化
  20. DaVinci DM6437 中文教程

热门文章

  1. 大数据相加_大数据相加
  2. linux访问nfs文件夹,linux配置NFS网络共享文件夹目录
  3. 计算机知识与技能竞赛配图,第七届”高教杯“全国大学生先进成图技术与产品信息建模创新大赛机械类计算机绘图试卷.doc...
  4. android vivo 模拟器,逍遥安卓打造VIVO华为魅族OPPO小米联想手游安卓模拟器
  5. 土木工程结构力学————钢架的位移法
  6. Go语言mgo使用情况
  7. PDF怎么编辑修改内容的免费方法
  8. powershell课后作业
  9. uniapp h5在浏览器唤起app
  10. ggplot2学习笔记7:通过图层逐层构建图形