Windows|基于U3V协议的libusb库的使用

2024-04-13 11:20
文章标签 使用 windows 协议 libusb u3v

本文主要是介绍Windows|基于U3V协议的libusb库的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 发现初始化设备

参考:
libusb四种传输方式详细介绍可见http://blog.chinaunix.net/uid-25314474-id-3040231.html
Linux libusb USB开发(三)—— libusb函数库及接口函数介绍(https://blog.csdn.net/jiguangfan/article/details/86546958)
【USB笔记】端点描述符Endpoint Descriptor(https://blog.csdn.net/u012028275/article/details/109689169)
USB_4大描述符(https://blog.csdn.net/daocaokafei/article/details/114380506)
二,usb描述符-设备 配置 接口 端点(https://blog.csdn.net/u011456016/article/details/129464735)

发现初始化设备

// libusb 初始化,这一步必须首先执行。
usb_init();
// 寻找系统上的usb总线,任何usb设备都通过usb总线和计算机总线通信。
// 此函数返回总线数,失败返回负值。
usb_find_busses();
// 寻找总线上的usb设备,这个函数必要在调用usb_find_busses()后使用。
// 此函数成功返回设备数目,失败返回负值。
usb_find_devices();
struct usb_bus *pbus = nullptr;
struct usb_device *pdev;
struct usb_dev_handle *m_usbHandle;
// usb_get_busses返回全局变量 usb_busses,用于遍历总线链表,
// 查找总线 usb 设备。失败返回 NULL。
for (pbus = usb_get_busses();pbus != nullptr;pbus = pbus->next)
{for (pdev = pbus->devices;pdev != nullptr;pdev = pdev->next){if(dev->descriptor.idVendor==VENDOR_ID&& dev->descriptor.idProduct == PRODUCT_ID) {// 这里可以添加设备的初始化代码 // 打开 usb 设备,引用的 usb_dev_handle 以及 usb_device 结构体分别为usb设备操作句柄// 和usb设备描述符,具体定义可见头文件。函数返回 usb 设备的操作句柄,// 之后的对该 usb 设备的操作都通过该句柄进行。m_usbHandle = usb_open(m_usbDev);// 复位指定的endpoint,参数ep 是指bEndpointAddress。这个函数用来替代usb_resetep函数。usb_clear_halt(m_usbHandle, 0);usb_clear_halt(m_usbHandle, 1);usb_clear_halt(m_usbHandle, 2);// 设置当前设备使用的configuration(配置模式),参数2configuration 是你要使用的//configurtation descriptoes中bConfigurationValue, 函数返回0成功,<0失败//(一个设备可能包含多个configuration,比如同时支持高速和低速的设备就有对应的//两个configuration,详细可查看usb标准和具体的usb设备)				 usb_set_configuration(m_usbHandle, 1);// 注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,// 才能做相应的操作(比如收发数据)。第二个参数Interface 指 bInterfaceNumber. // (下面介绍的usb_release_interface 与之相对应,也是必须调用的函数)usb_claim_interface(m_usbHandle, 0);usb_claim_interface(m_usbHandle, 1);usb_claim_interface(m_usbHandle, 2);// 保存&初始化通信端点// config:配置描述符// bNumInterfaces:配置所支持的接口个数, 表示有多少个接口描述符for (int i = 0; i < m_usbDev->config->bNumInterfaces;i++){// usb_interface:接口描述符const struct usb_interface *interface = &(m_usbDev->config->interface[i]);// num_altsetting:接口支持的端点数量 可选设置的数量for (int j = 0; j < interface->num_altsetting; j++){// 每一个端点具体操作// usb_interface_descriptor :接口描述符// altsetting包含所有可用于该接口的可选设置的接口结构数组。每个包含一套端点配置。这些接口结构没有特别的顺序。const struct usb_interface_descriptor *altsetting = &(interface->altsetting[j]);// bNumEndpoints要使用的端点个数(不包括端点0), 表示有多少个端点描述符,比如鼠标就只有一个端点for (int k = 0; k < altsetting->bNumEndpoints; k++){//usb_endpoint_descriptor 端点描述符对象const struct usb_endpoint_descriptor *endpoint = &(altsetting->endpoint[k]);// bInterfaceProtocol:接口所遵循的协议//#define CTRL_EP_PROTOCOL	0//#define EVENT_EP_PROTOCOL	1//#define STREAM_EP_PROTOCOL 2if (altsetting->bInterfaceProtocol == CTRL_EP_PROTOCOL){// bInterfaceNumber:接口的编号m_ctrlInterface = static_cast<int>(altsetting->bInterfaceNumber);/*获取A的 bit N位的值*///#define GET_BIT(A,N)	((A >> N) & 0x1)// bEndpointAddress端点编号,比如端点1,就是1// bit0~3表示端点地址,bit8 表示方向,输入还是输出if (GET_BIT(endpoint->bEndpointAddress, 7)){m_ctrlInEp = static_cast<int>(endpoint->bEndpointAddress);}else{m_ctrlOutEp = static_cast<int>(endpoint->bEndpointAddress);}}else if (altsetting->bInterfaceProtocol == EVENT_EP_PROTOCOL){m_eventInterface = static_cast<int>(altsetting->bInterfaceNumber);m_eventEp = static_cast<int>(endpoint->bEndpointAddress);}else if (altsetting->bInterfaceProtocol == STREAM_EP_PROTOCOL){m_streamInterface = static_cast<int>(altsetting->bInterfaceNumber);m_streamEp = static_cast<int>(endpoint->bEndpointAddress);}}}// 记录所有设备id// vecId.push_back(pdev->devnum);break;}}
}

这篇关于Windows|基于U3V协议的libusb库的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念