Соорудил на своей 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Кб/с не выходит. Продолжаем эксперименты.







