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