зажечь светодиодный накопитель - PullRequest
1 голос
/ 02 июня 2011

У меня массовое использование USB со светодиодом

Я пытаюсь включить и выключить светодиод

с помощью USB-анализатора пакетов USBlyzer,

Я могу получить сыройданные

55 53 42 43 58 66 93 88 00 00 00 00 00 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

, чья информация запроса является массовой илиПередача прерываний и ввод / вывод отсутствуют

и в разделе свойств USB

я могу получить такую ​​информацию, как

Дескриптор конечной точки 81 1 In, навалом 512 байт

bDescriptorType 05h Endpoint

bEndpointAddress 81h 1 In

Дескриптор конечной точки 02 2 В объеме, 512 байт

bDescriptorType 05h Endpoint

bEndpointAddress 02h 2 Out

Я сделал код на python 2.7, libusb-win32-bin-1.2.4.0, pyusb-1.0.0-a1

полный источник здесь

import usb.core
import usb.util

# find our device
dev = usb.core.find(idVendor=0x1516, idProduct=0x8628)

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

dev.set_configuration()
# get an endpoint instance
cfg = dev.get_active_configuration()
interface_number = cfg[0].bInterfaceNumber
alternate_setting = usb.control.get_interface(interface_number)
intf = usb.util.find_descriptor(cfg, bInterfaceNumber = \
                                ineterface_number, bAlternateSetting = alternate_setting)
ep = usb.util.find_descriptor(intf,custom_match = \
                                  lambda e: \
                                      usb.util.endpoint_direction(e.bEndpointAddress) == \
                                      usb.util.ENDPOINT_OUT)
# set the active configuration. With no arguments, the first
# configuration will be the active one


assert ep is not None

ep.write(0x2,0x55)
ep.write(0x2,0x53)
ep.write(0x2,0x42)
ep.write(0x2,0x43)
ep.write(0x2,0x58)
ep.write(0x2,0x66)
ep.write(0x2,0x93)
ep.write(0x2,0x88)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x06)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)
ep.write(0x2,0x00)

, но когда я пытаюсь его выполнить,

Traceback (most recent call last):
  File "C:\Documents and Settings\kty1104\Desktop\usb2.py", line 14, in <module>
    interface_number = cfg[0].bInterfaceNumber
  File "C:\Python27\lib\site-packages\usb\core.py", line 447, in __getitem__
    return Interface(self.device, index[0], index[1], self.index)
TypeError: 'int' object is not subscriptable

возникают

что не так смой код?

любой, если что-то не так, пожалуйста, дайте мне знать

спасибо!

1 Ответ

2 голосов
/ 02 июня 2011

Я ничего не знаю о pyusb, но моя интерпретация сообщения об ошибке заключается в том, что, вопреки мнению других, cfg не является целым числом, но для него требуется нецелый индекс. Я говорю это потому, что исключение выдается в функции __getitem__, которая может быть только cfg s __getitem__, потому что это единственное место, где в строке

будет сделан вызов __getitem__
interface_number = cfg[0].bInterfaceNumber

Теперь, если бы cfg было int, у него не было бы __getitem__. Проблема в том, что cfg __getitem__, похоже, рассчитывает на возможность получить индекс index, который он получает, как показано двумя средними аргументами index[0], index[1]. Поскольку вы передали cfg целое число, это невозможно.


Из учебника :

Вы также можете использовать индекс оператор для доступа к дескрипторам случайно, вот так:

>>> # access the second configuration
>>> cfg = dev[1]
>>> # access the first interface
>>> intf = cfg[(0,0)]
>>> # third endpoint
>>> ep = intf[2] 

Как видите, индекс равен нулю. Но ждать! Там что-то странное в том, как я получаю доступ интерфейс ... Да, вы правы, подстрочный оператор в Конфигурация принимает последовательность два предмета, причем первый индекс интерфейса и второй, альтернативный параметр. Так, чтобы получить доступ к первому интерфейсу, но его Второй альтернативный параметр, мы пишем CFG [(0,1)].

...