pyusb环境搭建和无法发包问题

pyusb环境搭建和无法发包问题

项目需要对usb设备进行开发调试,选择搭建pyusb环境进行调试测试,这里记录下完整流程和中间解决的一些问题。

我使用的环境是window10 64bit, vscode 1.84.0 , Python 3.11.6

1 安装流程

参考github上的 https://github.com/pyusb/pyusb 的readme。

安装步骤分为两步

  1. Requirements and platform 安装依赖

    pyusb是依赖于libusb库的python层面封装,所以要安装对应的库。
    此处是windows环境,作者提供了2种选择

    1.使用 pyocd/libusb-package 库进行安装,libusb-package库中自带了 libusb-1.0.dll的库。但是使用api的方式会有差异。

    2.直接将libusb-1.0的dll拷贝到windows的系统目录,比如 C:\Windows\System32 (通过 libusb:https://libusb.info/ 官网可以下载)

    这里使用了安装libusb-package的方式

pip install libusb-package
  1. Installing 安装pyusb

    这里直接安装最新版本即可。

# the latest official release
python -m pip install pyusb
2 使用流程

官网提供的demo示例如下

import usb.core
import usb.util

# find our device
dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001)

# was it found?
if dev is None:
    raise ValueError('Device not found')

# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()

# get an endpoint instance
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

# write the data
ep.write('test')

因为这里使用libusb-package,参考https://github.com/pyocd/libusb-package/ 介绍的查找设备的方式不同

dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001)
——》
import libusb_package
for dev in libusb_package.find(find_all=True):
    print(dev)

这里可以使用VendorID 和 ProductID 指定对应的USB设备。

这里修改后可用的发包代码如下

import os
import usb.core 
import usb.util
import libusb_package
import usb.backend.libusb1

devlist = libusb_package.find(find_all=True, idVendor=0xfffe, idProduct=0x0001)

for dev in devlist :
    print(dev)
    dev.set_configuration()

    # get an endpoint instance
    cfg = dev.get_active_configuration()

    intf = cfg[(0,0)]
    ep = usb.util.find_descriptor(
        intf,
        # match the first OUT endpoint
        custom_match = \
        lambda e: \
            usb.util.endpoint_direction(e.bEndpointAddress) == \
            usb.util.ENDPOINT_OUT)

    assert ep is not None
    # write the data
    count = ep.write('test',10)
    print("send count " + str(count))

最终能得到结果如下,显示了usb设备的 设备描述符,配置描述符,接口描述符,端点描述符
在这里插入图片描述

驱动安装

基于上述代码在运行时会报如下错误

 in __init__
    _check(_lib.libusb_open(self.devid, byref(self.handle)))
  File "C:\Users\xx\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\usb\backend\libusb1.py", line 600, in _check
    raise NotImplementedError(_strerror(ret))
NotImplementedError: Operation not supported or unimplemented on this platform

可以看到提示libusb_open未实现
参考如下博客:https://blog.csdn.net/weixin_42967006/article/details/108755972

需要为设备修改驱动,默认的usb设备会有对应的默认驱动,这里需要使用libusb去访问设备,需要安装特定的驱动。

Zadig下载地址:https://zadig.akeo.ie/

Zadig打开后,如果当前插入的USB设备都已经安装了驱动(我们常用的键鼠、U盘等都是自动安装了驱动的),这里的设备选择栏里就会没有设备,因为现在显示的是没有安装驱动的USB设备。可以通过勾选List All Devices查看所有设备。

Zadig包含了4种类型的驱动 WinUSB (v6.1) / Libusb-win32 / libusbK v3.1.0 / USB Serial CDC 。这里实际尝试 前3种都可以解决NotImplementedError的报错,Libusb-win32 / libusbK v3.1.0在抓包时无法抓到host发出的包,只有 WinUSB (v6.1)可以解决抓包的问题。

但是如上述博客所述,在修改对应设备的驱动为WinUSB (v6.1)驱动之后,会导致该设备原来的功能不能使用,主要是 VendorID 和 ProductID 相同的USB设备都会使用新安装的 WinUSB驱动,而不会使用 其原先自动安装的驱动。

驱动恢复

因为这里我还是需要支持设备原先的功能,但是用默认的驱动检索安装方式都无法安装,所以简单介绍一下恢复到原有驱动的方法,参考如下博客的介绍:http://www.wrgho.com/help53.html

在这里插入图片描述
在这里插入图片描述

参考文档

https://blog.csdn.net/weixin_42967006/article/details/108755972 Windows环境下基于Python的PyUSB库开发USB通讯

https://blog.csdn.net/zbb297918657/article/details/103012320 Python中pyusb的开发及使用

https://github.com/pyusb/pyusb

https://github.com/pyusb/pyusb/blob/master/docs/tutorial.rst tutorial

https://github.com/pyocd/libusb-package/

https://blog.csdn.net/qq_31094099/article/details/102935180 【USB】Zadig 工具的使用说明与下载

https://github.com/pbatard/libwdi/wiki/Zadig Zadig

http://www.wrgho.com/help53.html 如何强制安装指定驱动

https://libusb.info/ libusb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/116762.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伪随机序列——m序列及MATLAB仿真

文章目录 前言一、m 序列1、m 序列的产生2、m 序列的性质①、均衡性②、游程分布③、移位相加特性④、自相关函数⑤、功率谱密度⑥、伪噪声特性 二、M 序列1、m 序列的产生2、m 序列的性质 三、MATLAB 中 m 序列1、m 序列生成函数的 MATLAB 代码2、MATLAB 仿真 前言 在通信系统…

Photoshop 2023 v24.7

Photoshop是一款强大的图像编辑软件,被广泛应用于图像处理、图形设计、数字绘画等领域。它提供了丰富的图像编辑功能,可以用于调整图像的色彩、亮度、对比度等,添加特效、滤镜,以及进行复杂的图像合成和修复。 以下是Adobe Photo…

基于动力学模型的机械臂滑膜控制

一、滑模控制设计思路 参考资料:https://zhuanlan.zhihu.com/p/463230163(思路理解) https://blog.csdn.net/xiaohejiaoyiya/article/details/90271529(干扰的处理) 滑模控制的思路有两个关键,一个是设计…

一文通透各种注意力:从多头注意力MHA到分组查询注意力GQA、多查询注意力MQA

前言 通过本博客内之前的文章可知,自回归解码的标准做法是缓存序列中先前标记的键(K)和值(V) 对,从而加快注意力计算速度。然而,随着上下文窗口或批量大小的增加,多头注意力 (MHA)模型中与 KV 缓存大小相关的内存成本显着增长 对…

【多线程】Lambda表达式

package org.example;public class TestLambda {public static void main(String[] args) {Like likenew Like();like.lambda();}}//定义一个函数式接口 interface ILike{void lambda(); }//实现类 class Like implements ILike{Overridepublic void lambda() {System.out.prin…

Excel自学三部曲_Part3:Excel工作场景实战(四)

文章目录 四、高级函数与数据连接1. 多窗口操作2. VLOOKUP函数3. XLOOKUP函数4. CSV数据格式 四、高级函数与数据连接 1. 多窗口操作 如何将两张子表数据(战区信息、城市信息)连接到主表数据(成交数据),增加主要数据的…

“一键批量拆分HTML文本,高效整理文件,提升工作效率“

您是否曾经被大量的HTML文本文件困扰,难以找到所需的特定信息?现在,我们向您推荐一款强大的工具,它能够一键拆分HTML文本,让您轻松实现文件整理,提高工作效率! 首先,在首助编辑高手…

人工智能基础_机器学习014_BGD批量梯度下降公式更新_进一步推导_SGD随机梯度下降和MBGD小批量梯度下降公式进一步推导---人工智能工作笔记0054

然后我们先来看BGD批量梯度下降,可以看到这里,其实这个公式来源于 梯度下降的公式对吧,其实就是对原始梯度下降公式求偏导以后的梯度下降公式,然后 使用所有样本进行梯度下降得来的,可以看到* 1/n 其实就是求了一个平均数对吧.所有样本的平均数. 然后我们看,我们这里* 1/n那么…

API接口安全设计

简介 HTTP接口是互联网各系统之间对接的重要方式之一,使用HTTP接口开发和调用都很方便,也是被大量采用的方式,它可以让不同系统之间实现数据的交换和共享。 由于HTTP接口开放在互联网上,所以我们就需要有一定的安全措施来保证接口…

C++11 initializer_list 轻量级初始化列表的使用场景(让自定义类可以用初始化列表的形式来实例化对象)

initializer_list 是 C11 中的一个特性&#xff0c;它允许你使用花括号 {} 中的值列表来初始化容器或数组。通常用于初始化标准库容器&#xff0c;比如 std::vector、std::set、std::map 以及数组。 场景一&#xff1a;用初始化列表初始化容器 std::vector<int> arr {…

【深度学习】pytorch——Autograd

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——Autograd Autograd简介requires_grad计算图没有梯度追踪的张量ensor.data 、tensor.detach()非叶子节点的梯度计算图特点总结 利用Autograd实…

scrapy+selenium框架模拟登录

目录 一、cookie和session实现登录原理 二、模拟登录方法-Requests模块Cookie实现登录 三、cookiesession实现登录并获取数据 四、selenium使用基本代码 五、scrapyselenium实现登录 一、cookie和session实现登录原理 cookie:1.网站持久保存在浏览器中的数据2.可以是长期…

Day20力扣打卡

打卡记录 数组中两个数的最大异或值&#xff08;位运算&#xff09; 链接 二进制位上从高位向低位进行模拟&#xff0c;看数组中是否有满足此情况的数字。具体题解 class Solution { public:int findMaximumXOR(vector<int>& nums) {int mx *max_element(nums.be…

【存档】vscode配置latex环境

原来在另一台电脑上找了个教程配了一遍&#xff0c;这次重新配的时候&#xff0c;那个教程作者更新过后&#xff0c;改成只有linux的脚本了&#xff0c;所以存档一下。真香警告, 2023年初的vscodelatex写作 - 知乎 (zhihu.com) 环境&#xff1a; win10/win11vscodelatex work…

【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)

目录 0. 前言 1. Cifar10数据集 2. AlexNet网络模型 2.1 AlexNet的网络结构 2.2 激活函数ReLu 2.3 Dropout方法 2.4 数据增强 3. 使用GPU加速进行批量训练 4. 网络模型构建 5. 训练过程 6. 完整代码 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我…

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

IDEA创建Springboot多模块项目

一、创建父模块 File --> New --> Project &#xff0c;选择 “ Spring Initalizr ” &#xff0c;点击 Next Next Next --> Finish 二、创建子模块 右键根目录&#xff0c;New --> Module 选择 “ Spring Initializr ”&#xff0c;点击Next 此处注意T…

设置IDEA快捷生成方法头,类头注释

1.File->settings->editor->live templates进入Live Template界面进行设置&#xff1a; 下一步&#xff1a; 下一步&#xff1a; /*** Title: $title$* author: sunyanzeng* date: $datatime$*/在需要添加文件头的地方打出“aa”&#xff0c;回车&#xff0c;会自…

go语言 | grpc原理介绍(三)

了解 gRPC 通信模式中的消息流 gRPC 支持四种通信模式&#xff0c;分别是简单 RPC、服务端流式 RPC、客户端流式 RPC 和双向流式 RPC。 简单 RPC 在gRPC中&#xff0c;一个简单的RPC调用遵循请求-响应模型&#xff0c;通常涉及以下几个关键步骤和组件&#xff1a; 请求头&a…

Java自学第2课:Java语言基础知识要点

1 Java主类结构 任务&#xff1a;创建新项目名为item&#xff0c;包名为number&#xff0c;类名为first。 1.1 包声明 不指定包时&#xff0c;默认就是工程名&#xff0c;指定后&#xff0c;类文件可以分类了&#xff0c;是这意思吧。包就大概等于一个文件夹。而且在类文件中…