在Python中与USB设备通信

Dat*_*nde 4 python

我想与USB设备进行通信并将数据发送到USB设备.我能够找到该设备,但在将设备与内核驱动程序连接时,它正在给出USB Error: Resource Busy.以下是我的代码:

    dev = usb.core.find(idVendor=0x0403, idProduct=0x6001)
    dev.set_configuration() 

    cfg = dev.get_active_configuration() 

    dev.attach_kernel_driver(interface) 

    interface_number = cfg[(0,0)].bInterfaceNumber 
    alternate_settting = usb.control.get_interface(interface_number) 
    intf = usb.util.find_descriptor( 
    cfg, bInterfaceNumber = interface_number, 
    bAlternateSetting = alternate_setting) 

    ep = usb.util.find_descriptor(intf,custom_match = \
          lambda e: \
    usb.util.endpoint_direction(e.bEndpointAddress) == \
    usb.util.ENDPOINT_OUT) 

    dev.detach_kernel_driver(interface)

    ep.write("\r"+linea1[:19]+"\n\r"+" "*(20-len(linea2))+linea2)  
Run Code Online (Sandbox Code Playgroud)

Cod*_*ers 8

假设您使用Linux并libusb-1.0作为PyUSB后端库.

根据libusb文档:

// Detach a kernel driver from an interface.
// If successful, you will then be able to claim the interface and perform I/O.
int libusb_detach_kernel_driver (libusb_device_handle *dev, 
                                 int interface_number)  

// Re-attach an interface's kernel driver, which was previously 
// detached using libusb_detach_kernel_driver().
int libusb_attach_kernel_driver(libusb_device_handle *dev,
                                int interface_number)
Run Code Online (Sandbox Code Playgroud)

所以基本上,你需要调用detach_kernel_driver 首先从设备的接口拆下已经连接内核驱动程序(如果有的话),这样你就可以在你的代码与它通信(它要么你的代码或一些内核驱动程序交谈设备的接口).完成后,您可能需要再次调用attach_kernel_driver重新附加内核驱动程序.

我相信如果你能确保没有为给定设备加载内核驱动程序(或者在运行代码之前手动卸载它),就不需要调用任何C函数/ Python方法.

编辑:

我刚刚得到这段代码(基于你的样本)工作.注意:为简单起见,我已经硬编码0作为接口号,detach_kernel_driver并且attach_kernel_driver- 你应该让它变得更聪明,我想.

import usb

dev = usb.core.find(idVendor=0x0403, idProduct=0x6001)

reattach = False
if dev.is_kernel_driver_active(0):
    reattach = True
    dev.detach_kernel_driver(0)

dev.set_configuration() 
cfg = dev.get_active_configuration() 

interface_number = cfg[(0,0)].bInterfaceNumber 
alternate_settting = usb.control.get_interface(dev, interface_number) 
intf = usb.util.find_descriptor(cfg, bInterfaceNumber = interface_number, 
                            bAlternateSetting = alternate_settting) 

ep = usb.util.find_descriptor(intf,custom_match = \
      lambda e: \
    usb.util.endpoint_direction(e.bEndpointAddress) == \
    usb.util.ENDPOINT_OUT) 
ep.write("test\n\r")

# This is needed to release interface, otherwise attach_kernel_driver fails 
# due to "Resource busy"
usb.util.dispose_resources(dev)

# It may raise USBError if there's e.g. no kernel driver loaded at all
if reattach:
    dev.attach_kernel_driver(0) 
Run Code Online (Sandbox Code Playgroud)