felHR85 / WinUsbPy

A python wrapper over WinUsb library
MIT License
28 stars 21 forks source link

High lvl api bugfix: #11

Open Nimelli opened 4 years ago

Nimelli commented 4 years ago

Hi,

Thanks for this wrapper.

I had initially some issues connecting to my USB device using the high level API. Especially, init_winusb_device() required a 'name' field, which doesn't make sense IMHO.

Also, some high level API functions (as write, read, etc.) were throwing errors due to indexing the interface handle (self.handle_winusb[self._index] ???)

I propose the following changes then, which worked for me (and my device)

Platform: Windows 10, python 3.8.6 32bit USB test device: Custom STM32 USB device (CDC data, bulk transfert with 1 IN and 1 OUT endpoint)

ajoverhage commented 4 years ago

Any chance you could provide an example file for communicating with the device using the updates?

Nimelli commented 4 years ago

@ajoverhage I talked with my device using something like this:

api = WinUsbPy()
result = api.list_usb_devices(deviceinterface=True, present=True)
if result:
    print(result)
    if api.init_winusb_device(vid, pid):

        interface_descriptor = api.query_interface_settings(0)

        if interface_descriptor != None:
            print("bLength: " + str(interface_descriptor.b_length))
            print("bDescriptorType: " + str(interface_descriptor.b_descriptor_type))
            print("bInterfaceNumber: " + str(interface_descriptor.b_interface_number))
            print("bAlternateSetting: " + str(interface_descriptor.b_alternate_setting))
            print("bNumEndpoints " + str(interface_descriptor.b_num_endpoints))
            print("bInterfaceClass " + str(interface_descriptor.b_interface_class))
            print("bInterfaceSubClass: " + str(interface_descriptor.b_interface_sub_class))
            print("bInterfaceProtocol: " + str(interface_descriptor.b_interface_protocol))
            print("iInterface: " + str(interface_descriptor.i_interface))

        pipe_info_list = map(api.query_pipe, range(interface_descriptor.b_num_endpoints))
        for item in pipe_info_list:
            print("PipeType: " + str(item.pipe_type))
            print("PipeId: " + str(item.pipe_id))
            print("MaximumPacketSize: " + str(item.maximum_packet_size))
            print("Interval: " + str(item.interval))

        while True:
            str_tx = input("TX: ")
            if str_tx == "exit":
                print("exiting...")
                break
            api.write(0x01, str_tx.encode('utf-8'))
            raw_rx = api.read(0x81, 64)
            str_rx = raw_rx.decode('utf-8')
            print("RX: " + str_rx)

        if api.close_winusb_device():
            print('close correct')

This code is writing your input to endpoint 1 OUT (addr 0x01), and my USB device is echoing what is received to endpoint 1 IN (addr: 0x81)

robojay commented 3 years ago

I'm starting to use WinUsbPy high level API in a project and am running into the same bugs (fixed here... i.e. find_device not calling is_device properly).

Any status on pulling these fixes into the main branch?