QT Creater与libusb使用

新建一个C项目,然后修改.pro文件,添加LIBS一行

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

LIBS += "D:Projectsqtusbtestlibusb.a"

SOURCES += main.c

源码:

#include <stdio.h>
#include "lusb0_usb.h"

#define MY_VID 0x04f3
#define MY_PID 0x0103
#define m_dev_DATA_SIZE 8       /* Number of bytes to get at once */

usb_dev_handle * my_usb_get_device_list(void)
{
    char str[64];
    struct usb_bus *bus;
    struct usb_device *dev;
    usb_dev_handle *udh;

    for (bus = usb_get_busses(); bus; bus = bus->next) {
        for (dev = bus->devices; dev; dev = dev->next) {
            printf("VID:PID = %x:%x
", dev->descriptor.idVendor, dev->descriptor.idProduct);
            if ((dev->descriptor.idVendor == MY_VID) && (dev->descriptor.idProduct == MY_PID))
            {
                udh = usb_open(dev);
                printf("dev opened: %s
", dev->filename);
                printf("Device Protocol : %d
",dev->descriptor.bDeviceProtocol);
                printf("Report Length : %d
",dev->descriptor.bLength);
                printf("Decriptor Type : %d
",dev->descriptor.bDescriptorType);
                printf("End Points : %d
",dev->config->interface->altsetting->bNumEndpoints);
                printf("Interface Class : %d
",dev->config->interface->altsetting->bInterfaceClass);
                printf("Protocol : %d
",dev->config->interface->altsetting->bInterfaceProtocol);
                printf("Interface Number: %d
",dev->config->interface->altsetting->bInterfaceNumber);
                printf("Device Filename : %s
",dev->filename);

                usb_get_string_simple(udh, dev->descriptor.iManufacturer, str, sizeof(str));
                printf("Device Manfucaturer : %s
", str);
                usb_get_string_simple(udh, dev->descriptor.iProduct, str, sizeof(str));
                printf("Product Name : %s
", str);
                usb_get_string_simple(udh, dev->descriptor.iSerialNumber, str, sizeof(str));
                printf("Device Serial Number: %s
", str);
                printf("End point addresses : 0x%x
",dev->config->interface->altsetting->endpoint->bEndpointAddress);


                return udh;
            }
        }
    }

    return NULL;
}

int main(void)
{
    int ret, i;
    char data[m_dev_DATA_SIZE] = {0};
    char data_zero[m_dev_DATA_SIZE] = {0};
    usb_dev_handle *udh;
    //char ShiftMouseScrollDown1[] = {0x02,0xf3,0xff};

    memset(data_zero, 0, m_dev_DATA_SIZE);

    usb_init(); /* initialize the library */
    printf("buses:%d
", usb_find_busses()); /* find all busses */
    printf("devices:%d
", usb_find_devices()); /* find all connected devices */

    udh = my_usb_get_device_list();
    if (!udh) {
        printf("usb dev handle is NULL
");
    }

    if(usb_set_configuration(udh, 1) < 0)
    {
        printf("Could not set configuration
");
        usb_close(udh);
        return 1;
    }

    if(usb_claim_interface(udh, 0) < 0) //claim_interface 0指向第一个设备
    {
        printf("Could not claim interface
");
        usb_close(udh);
        return 1;
    }

    while(1)
    {
        ret = usb_interrupt_read(udh, 0x81, data, m_dev_DATA_SIZE, 0);
        if (!memcmp(data, data_zero, m_dev_DATA_SIZE)) {
            continue;
        }
        printf("%02X ", (unsigned char)(data[2]));
        //printf("%c", (unsigned char)(data[2])-4+'a');
    }

    usb_release_interface(udh, 0);
    usb_close(udh);
    printf("m_dev closed
");



    printf("END!
");

    return 0;
}

需要将libusb0.dll和libusb0.sys添加到Sytem32目录下面去,否则运行就列机。

这时上面的程序还不能打印出USB设备来,是因为还需要安装USB的驱动。

运行下载文件夹中的bin/inf-wizard应用程序,选中你的USB设备然后一步一步地next,最后install,就可以了。

再次运行上面的源码编译得的程序,就可以看到真正的枚举输出了。

输入abcdefg时的反应:

另外参考:http://www.embed-net.com/thread-18-1-1.html

原文地址:https://www.cnblogs.com/tfanalysis/p/4438022.html