使用winUSB进行USB开发

2023-10-16 04:36
文章标签 进行 使用 开发 usb winusb

本文主要是介绍使用winUSB进行USB开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

什么是winUSB

WinUSB是Windows操作系统提供的一种通用USB驱动程序,用于简化USB设备的开发和使用。它是一个用户模式驱动程序,可以在Windows XP及更高版本的操作系统上使用。WinUSB提供了一组API和工具,使开发人员能够与USB设备进行通信,包括数据传输和设备控制。

以下是WinUSB的一些主要特点和功能:

  1. 简化开发:WinUSB提供了一组易于使用的API,使开发人员能够更容易地与USB设备进行通信。它提供了基于异步I/O的数据传输接口,支持批量传输、中断传输和控制传输。开发人员可以使用标准的Win32编程技术(如C/C++)来编写应用程序,与USB设备进行交互。

  2. 无需驱动程序开发经验:使用WinUSB,开发人员无需具备深入的驱动程序开发知识。相比于传统的内核模式驱动程序开发,WinUSB的用户模式驱动程序更容易理解和使用。这使得USB设备的开发变得更加简单和快速。

  3. 驱动程序自动安装:当使用WinUSB驱动程序时,Windows操作系统可以自动安装所需的驱动程序,无需手动安装或配置驱动程序。这大大简化了使用USB设备的过程,减少了用户的繁琐操作。

  4. 兼容性:WinUSB驱动程序在Windows XP及更高版本的操作系统上都可以使用。这使得开发人员可以编写一次代码,并在不同版本的Windows系统上运行,提高了应用程序的兼容性。

需要注意的是,WinUSB适用于直接与USB设备进行通信的应用程序,而不适用于USB设备的传统功能,例如打印机、扫描仪等。对于这些设备,通常需要使用特定的设备类驱动程序或供应商提供的驱动程序。

举了例子

以下是一个使用WinUSB进行批量传输(Bulk Transfer)的示例代码:

#include <Windows.h>
#include <SetupAPI.h>
#include <winusb.h>
#include <iostream>// USB设备的Vendor ID和Product ID
#define VENDOR_ID 0x1234
#define PRODUCT_ID 0x5678// 批量传输管道的端点地址
#define BULK_IN_ENDPOINT 0x81
#define BULK_OUT_ENDPOINT 0x02int main()
{// 初始化WinUSB库BOOL result = WinUsb_Initialize(NULL, NULL, NULL, NULL);if (!result){std::cout << "Failed to initialize WinUSB." << std::endl;return 1;}// 枚举USB设备HDEVINFO deviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);if (deviceInfoSet == INVALID_HANDLE_VALUE){std::cout << "Failed to enumerate USB devices." << std::endl;WinUsb_Free(NULL);return 1;}// 遍历设备列表,查找指定的USB设备SP_DEVINFO_DATA deviceInfoData = { 0 };deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);for (DWORD index = 0; SetupDiEnumDeviceInfo(deviceInfoSet, index, &deviceInfoData); ++index){// 获取设备的USB描述符SP_DEVICE_INTERFACE_DATA interfaceData = { 0 };interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);if (!SetupDiEnumDeviceInterfaces(deviceInfoSet, &deviceInfoData, &GUID_DEVINTERFACE_USB_DEVICE, 0, &interfaceData)){continue;}// 获取设备路径DWORD requiredSize = 0;SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &interfaceData, NULL, 0, &requiredSize, NULL);PSP_DEVICE_INTERFACE_DETAIL_DATA interfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(requiredSize);interfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &interfaceData, interfaceDetailData, requiredSize, NULL, NULL)){free(interfaceDetailData);continue;}// 打开设备HANDLE deviceHandle = CreateFile(interfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);if (deviceHandle == INVALID_HANDLE_VALUE){free(interfaceDetailData);continue;}// 获取WinUSB接口句柄WINUSB_INTERFACE_HANDLE winusbHandle = NULL;result = WinUsb_Initialize(deviceHandle, &winusbHandle);if (result){// 获取USB设备的描述符USB_DEVICE_DESCRIPTOR deviceDescriptor;result = WinUsb_GetDescriptor(winusbHandle, USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, (PUCHAR)&deviceDescriptor, sizeof(deviceDescriptor), NULL);if (result){// 检查Vendor ID和Product ID是否匹配if (deviceDescriptor.idVendor == VENDOR_ID && deviceDescriptor.idProduct == PRODUCT_ID){// 发送数据UCHAR outBuffer[64] = { 0 }; // 要发送的数据DWORD bytesTransferred = 0;result = WinUsb_WritePipe(winusbHandle, BULK_OUT_ENDPOINT, outBuffer, sizeof(outBuffer), &bytesTransferred, NULL);if (result){std::cout << "Data sent successfully." << std::endl;}else{std::cout << "Failed to send data." << std::endl;}// 接收数据UCHAR inBuffer[64] = { 0 }; // 用于接收数据result = WinUsb_ReadPipe(winusbHandle, BULK_IN_ENDPOINT, inBuffer, sizeof(inBuffer), &bytesTransferred, NULL);if (result){std::cout << "Data received successfully." << std::endl;}else{std::cout << "Failed to receive data." << std::endl;}}}// 关闭WinUSB接口WinUsb_Free(winusbHandle);}// 关闭设备句柄CloseHandle(deviceHandle);free(interfaceDetailData);}// 释放资源SetupDiDestroyDeviceInfoList(deviceInfoSet);WinUsb_Free(NULL);return ;}

以上示例代码展示了如何使用WinUSB进行批量传输(Bulk Transfer)。在示例代码中,我们首先初始化WinUSB库,然后通过SetupAPI枚举连接到计算机的USB设备,并查找与指定的Vendor ID和Product ID匹配的设备。

如果设备匹配成功,我们可以使用WinUsb_WritePipe函数发送数据,以及使用WinUsb_ReadPipe函数接收数据。在示例代码中,我们使用了BULK_OUT_ENDPOINT和BULK_IN_ENDPOINT来指定批量传输的输入和输出端点地址。

你可以根据自己的需求修改示例代码,例如更改发送和接收的数据缓冲区大小、使用异步传输等。

请注意,上述示例代码仅展示了WinUSB进行批量传输的基本用法。实际使用时,你需要根据具体设备的通信协议和要求进行适当的修改和扩展。此外,WinUSB还提供了其他功能和API,例如控制传输、同步传输等,可以根据需要进行进一步的学习和使用。

在实际开发中,建议参考Microsoft官方文档和示例代码,以获取更详细和全面的WinUSB使用说明。
在这里插入图片描述

这篇关于使用winUSB进行USB开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219080

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

关于pandas的read_csv方法使用解读

《关于pandas的read_csv方法使用解读》:本文主要介绍关于pandas的read_csv方法使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录pandas的read_csv方法解读read_csv中的参数基本参数通用解析参数空值处理相关参数时间处理相关