[英]Communication with the USB device in 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)
假設你使用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)
所以基本上,你需要調用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.