2016-06-21 8 views
1

UPDATEPyUSB отправить отчет HID


мне это удалось отправить данные правильно. Для тех, кто, как столкнулся с той же проблемой, я использовал следующий код:

data=[0x00, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0x00, 0x00] 
result=dev.ctrl_transfer(0x21, 0x9, wValue=0x200, wIndex=0x00, data_or_wLength=data) 

(это основано на ответе размещены здесь: link )

Но я не понимаю, в деталях, почему Я должен использовать

bmRequestType=0x21 
bRequest=0x9 
wValue=0x200 

Если бы кто-нибудь мог объяснить это более подробно, я был бы признателен. Я просто хочу учиться.


Первоначальный запрос:


Я отчаянно пытаюсь отправить простой отчет в HID-устройство с помощью PyUSB.

Использование «SimpleHIDwrite» Я подтвердил, что устройство работает так, как ожидалось. Я хочу, чтобы отправить эти данные:

отчет ID: 00

данные: [00, 04, 04, FF, FF, FF, 00, 00]

sending data using SimpleHIDwrite

Я совершенно новый для python и USB, и я не могу понять, как это сделать, используя dev.ctrl_transfer или dev.write.

Также есть сообщения о передаче данных на устройства HID, но я не мог понять, как решить мою проблему.

Может ли кто-нибудь быть таким добрым, чтобы указать мне в правильном направлении?

спасибо!

Вот еще некоторые детали:

# based on https://github.com/walac/pyusb/blob/master/docs/tutorial.rst 

import usb.core 
import usb.util 

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


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

dev.set_configuration() 

cfg=dev[0] 
intf=cfg[(0,0)] 
ep=intf[0] 

# dev.write(ep.bEndpointAddress, [0x00, 0x00,0x04,0x04,0xFF,0xFF,0xFF,0x00, 0x00], 1000) 
# dev.ctrl_transfer(bmRequestType, bRequest, wValue=0, wIndex=0, data_or_wLength=None, timeout=None) 

print("print ep") 
print(ep) 
print("print cfg") 
print(cfg) 
print("print intf") 
print(intf) 

И результат вышеприведенного сценария заключается в следующем:

print ep 
     ENDPOINT 0x81: Interrupt IN ========================== 
     bLength   : 0x7 (7 bytes) 
     bDescriptorType : 0x5 Endpoint 
     bEndpointAddress : 0x81 IN 
     bmAttributes  : 0x3 Interrupt 
     wMaxPacketSize : 0x8 (8 bytes) 
     bInterval  : 0xa 
print cfg 
    CONFIGURATION 1: 100 mA ================================== 
    bLength    : 0x9 (9 bytes) 
    bDescriptorType  : 0x2 Configuration 
    wTotalLength   : 0x22 (34 bytes) 
    bNumInterfaces  : 0x1 
    bConfigurationValue : 0x1 
    iConfiguration  : 0x0 
    bmAttributes   : 0x80 Bus Powered 
    bMaxPower   : 0x32 (100 mA) 
    INTERFACE 0: Human Interface Device ==================== 
    bLength   : 0x9 (9 bytes) 
    bDescriptorType : 0x4 Interface 
    bInterfaceNumber : 0x0 
    bAlternateSetting : 0x0 
    bNumEndpoints  : 0x1 
    bInterfaceClass : 0x3 Human Interface Device 
    bInterfaceSubClass : 0x0 
    bInterfaceProtocol : 0x0 
    iInterface   : 0x0 
     ENDPOINT 0x81: Interrupt IN ========================== 
     bLength   : 0x7 (7 bytes) 
     bDescriptorType : 0x5 Endpoint 
     bEndpointAddress : 0x81 IN 
     bmAttributes  : 0x3 Interrupt 
     wMaxPacketSize : 0x8 (8 bytes) 
     bInterval  : 0xa 
print intf 
    INTERFACE 0: Human Interface Device ==================== 
    bLength   : 0x9 (9 bytes) 
    bDescriptorType : 0x4 Interface 
    bInterfaceNumber : 0x0 
    bAlternateSetting : 0x0 
    bNumEndpoints  : 0x1 
    bInterfaceClass : 0x3 Human Interface Device 
    bInterfaceSubClass : 0x0 
    bInterfaceProtocol : 0x0 
    iInterface   : 0x0 
     ENDPOINT 0x81: Interrupt IN ========================== 
     bLength   : 0x7 (7 bytes) 
     bDescriptorType : 0x5 Endpoint 
     bEndpointAddress : 0x81 IN 
     bmAttributes  : 0x3 Interrupt 
     wMaxPacketSize : 0x8 (8 bytes) 
     bInterval  : 0xa 

Process finished with exit code 0 

ответ

2

Не используйте PyUSB (если не нужны другие протоколы тоже). Управление HID не сложно, но есть гораздо более легкое решение.

HIDAPI is a C-library, который управляет протоколом, а также имеется a Python wrapper.

Кроме того, он скрывает необходимость возврата из операционной системы, которая распознает HID-протокол при подключении и устанавливает собственный драйвер.

+0

Спасибо! Вы правы: мне нужен только HID, поэтому нет необходимости использовать PyUSB. Итак, я дам hidapi попробовать. Однако мне удалось отправить данные с помощью ctrl_transfer. – xquitz

+0

Вы можете использовать PyUSB, но приложить много усилий. Мы использовали HIDAPI в университете, где я преподаю, и это делает HID просто формальностью. – jcoppens