Работа с USB в Python

Соорудил на своей stm32f4discovery собственное usb устройство. Все довольно просто, одна BULK конечная точка. Плата принимает данные и переключает светодиоды, которых в наличии четыре.
Собственно о программе контроллера как-то в другой раз, а сейчас о том, как с данным дивайсом работать с ПК.
Можно поступить по старинке и написать программу на си и libusb. Но это долговато и не весело.
Напишем на python.
Быстрое гугление привело меня на страницу проекта PyUSB.
Исходя из сказанного PyUSB — это обертка написанная на ctypes (прямо как я затеял libmodbus на ctypes обернуть) для libusb или openusb.
Поддерживается весь питон выше 2.4. С третим проблем не обнаружено.

Программа — модифицированная копия с wiki.

import usb.core
import usb.util

from time import sleep
import random
import time

# find our device
dev = usb.core.find(idVendor=0x0483, idProduct=0x5740)

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

# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()

# get an endpoint instance
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

Дальше у меня родилось два варианта развития событий.

Переключаем диоды случайным образом для проверки длительной работы.

while True:
        d = [random.randint(0, 1) for _ in range(4)]
        print("Sended: [{}]: {}".format(ep.write(d),d))
        sleep(0.3)

Замерим скорость без вывода в консоль и генерации случайных данных.

speed = 0
sended = 0
d = [random.randint(0, 1) for _ in range(64)]
timestamp = int(time.time())

for _ in range(100000):
        sended += ep.write(d)

timestamp2 = int(time.time())
print("Speed: {} Bps".format(sended/(timestamp2-timestamp)))

Вот так вот все быстро.
Вот только скорость передачи выше 400Кб/с не выходит. Продолжаем эксперименты.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий