python进行usb通讯_在Python中与USB设备通信

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

// 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)

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

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

编辑:

我刚刚得到这段代码(基于你的样本)工作.注意:为简单起见,我将hardcoded 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)


版权声明:本文为weixin_29061821原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。