win10下PyUSB访问USB驱动

目录

一、安装pyusb

二、下载工具zadig

三、确认目标USB设备

四、为目标设备安装USB驱动

五、测试代码

六、小结

1. 关于环境搭建

2. 关于总线上的数据


环境:

Win10专业版+Python3.8.7

一、安装pyusb

命令

pip install pyusb

二、下载工具zadig

Zadig是一个图形化工具,可以为USB设备一键选择所需安装的所有驱动。

下载链接:Zadig - USB driver installation made easy (akeo.ie)

下载得到的应该是一个可执行文件zadig-2.7.exe

三、确认目标USB设备

设备管理器中的目标USB设备应该是“其他设备”,且驱动应该是没有在安装的。

四、为目标设备安装USB驱动

双击打开zadig-2.7.exe,选中目标设备,可核对设备名称以及设备PID和VID。

单击“Install Driver”

安装中

安装结束,关闭对话框即可。

 这时候PC上的USB设备状态发生了改变

五、测试代码

USB设备有两个端点,且属于Bulk端点,端点描述符如下:

===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x82  -> Direction: IN - EndpointID: 2
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00


===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x03  -> Direction: OUT - EndpointID: 3
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00

要进行数据通信,需要关注三个字段:(1)端点号(2)端点类型(3)端点最大包长

文件:bulk_ep_wr.py

#!/usr/bin/python
# -*- coding:utf-8 -*- 
import usb.util
import sys

dev =  usb.core.find(idVendor= 0x0000, idProduct= 0xFF00)
if dev is None:
    raise ValueError('Device not found')
#print(dev) #USB设备的枚举信息

#设备配置,使能端点
dev.set_configuration()

#定义端点写函数
def write_bulk_out_ep(data):
        while(True):  
            try:
                data = dev.write(0x03, data, 1000)  #write(endpoint, data, timeout = None)
                print(data)
                break
            except Exception as e:
                print(e)
	
#定义端点读写函数		
def read_bulk_in_ep(len):
        while(True):  
            try:
                data = dev.read(0x82, len, 3000)  #read(endpoint, size_or_buffer, timeout = None)
                print(data)
                break
            except Exception as e:
                print(e)

#数据写测试	
data = [0x02] * 512
write_bulk_out_ep(data)

#数据读测试
#read_bulk_in_ep(512)

脚本的功能就是数据读写,即往OUT端点写512个字节,从IN端点中读出512字节。

数据通信设计USB协议内容,USB硬件端点FIFO要被数据接收方读走(且读完)才能继续进行下一笔数据通信,可以理解为Device与Host之间的数据传输是同步操作的。比如:HOST往OUT端点写一笔512字节的数据,Device要先读走,否则Host无法发出下一笔。

总线上数据如下:

 

六、小结

1. 关于环境搭建

单独安装libusb-win32没法解决问题,会有如下错误:

usb.core.USBError: [Errno 2] Entity not found

或者:

permission denied 等等错误。

这是因为,除了libusb-win32还需要安装libusbK等库,我们可以看zadig安装了哪一些:

 所以单独去安装这些东西,就会有各种各样的问题(漏安装,版本不兼容等),最好的做法就是直接使用zadig一次性安装完毕。

2. 关于总线上的数据

Bushound工具可以下发数据,但是没法读数据。包括一些大型的协议分析仪设备,当HOST端读走IN端点FIFO里面的数据后,总线上才能抓到数据。

猜你喜欢

转载自blog.csdn.net/qq_40088639/article/details/128221218