2016-06-21 5 views
1

MISE À JOURpyusb envoyer le rapport HID


J'ai réussi à envoyer les données correctement. Pour quiconque comment couru dans le même problème, je le code suivant:

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

(ceci est basé sur la réponse affichée ici: link )

Mais je ne comprends pas en détail, pourquoi Je dois utiliser

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

Si quelqu'un pouvait l'expliquer plus en détail, je serais reconnaissant. Je veux juste apprendre.


demande initiale:


J'essaie désespérément d'envoyer un rapport simple à un dispositif HID en utilisant pyusb.

En utilisant "SimpleHIDwrite" j'ai confirmé que l'appareil fonctionne comme prévu. Je veux envoyer ces données:

rapport ID: 00

données: [00, 04, 04, FF, FF, FF, 00, 00]

sending data using SimpleHIDwrite

Je suis tout à fait nouveau pour Python et USB et je ne peux pas comprendre comment faire cela en utilisant dev.ctrl_transfer ou dev.write.

En outre, il existe des articles sur l'envoi de données aux périphériques HID, mais je n'ai pas réussi à résoudre mon problème.

Pourriez-vous s'il vous plaît être si gentil de me diriger dans la bonne direction?

Merci beaucoup!

Voici quelques détails:

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

et le résultat du script est au-dessus ceci:

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 

Répondre

2

Ne pas utiliser pyusb (sauf si vous avez besoin d'autres protocoles aussi). Gérer HID n'est pas difficile, mais il y a une solution beaucoup plus facile.

HIDAPI is a C-library qui gère le protocole, et a Python wrapper est également disponible. En outre, il cache la nécessité de reprendre le contrôle du système d'exploitation, qui reconnaît le protocole HID lors de la connexion et d'installer son propre pilote.

+0

Merci! Vous avez raison: j'ai seulement besoin de HID donc il n'y a pas besoin d'utiliser réellement PyUSB. Donc, je vais essayer de faire un essai à Hidapi. Cependant, je l'ai réussi à envoyer les données correctement en utilisant ctrl_transfer. – xquitz

+0

Vous pouvez utiliser PyUSB, mais c'est beaucoup d'effort supplémentaire. Nous avons utilisé HIDAPI à l'université où j'enseigne, et cela fait de HID une simple formalité. – jcoppens