admin 管理员组

文章数量: 887019

1、概述

最近项目需要,在Windows下操作USB设备,决定采用QT进行操作,由于没有安装其它编译器,只有采用minGW编译器,网上搜了好多方法,比如hidapi库等,但还需要安装驱动,比较麻烦,我的是HID设备,采用libusb可以直接操作USB,非常方便。大致流程如下:

2、libusb库

2.1 下载libusb库

想挑战自己的可以下载libusb源码,安装minGW进行自己编译。我比较懒,直接下载别人编译好的现成库使用。link 下载xxx-binaries.7z解压即可

2.2 将库添加进QT工程

一开始采用在工程目录上右键->添加库的方式,无论怎么试都不行!添加外部库,报rules错误,添加系统库,找不到库文件。最后通过直接改.pro文件的方法添加成功!

win32: LIBS += -LE:\file\0_item\t\code\ -llibusb-1.0

-L后面紧跟库文件路径,采用绝对路径,-l后面跟库名

2.3添加库头文库

将libusb.h放进自己的工程目录下,在主文件中#include "libusb.h"这样就可以使用库函数了。

3 库函数的使用

可以直接看libusb.h文件及代码注释。源码是最好的老师。
基本的操作流程如下:
1.通过调用libusb_init来初始化库;(知道usb设备的ID可以直接到第4步)

libusb_init(NULL);

2.调用libusb_get_device_list来获得已经连接的设备的队列。这会创建一个libusb_device的数组,包含了所有连接到系统上的usb设备;

struct libusb_device **device_list;
int num_devices = libusb_get_device_list(NULL, &device_list);

3.循环遍历所有的设备来检查他们的选项;

for (int i = 0; i < num_devices; i++) 
{
		struct libusb_device *dev = device_list[i];
		struct libusb_device_descriptor dev_desc;
		libusb_get_device_descriptor(dev, &dev_desc);
		int id_vendor =  dev_desc.idVendor;
		int id_product = dev_desc.idProduct;
}

4.发现其中需要的一个,使用libusb_open或者libusb_open_device_with_vid_pid(当你知道这个设备vendor id和product id)来打开设备;

struct libusb_device_handle *dev_handle = NULL;
libusb_open(dev, &dev_handle);  //or
dev_handle = libusb_open_device_with_vid_pid(NULL, 0x0525, 0xa4a0);

5.使用libusb_free_device_list清除使用libusb_get_device_list获得的队列;

libusb_free_device_list(device_list, true);

6.通过libusb_claim_interface请求接口;

//获取端口
    dev = libusb_get_device(handle);
    libusb_get_config_descriptor(dev, 0, &conf_desc);
    number_interfaces = conf_desc->bNumInterfaces;

    if(number_interfaces > 0)
    {
        altesetting = conf_desc->interface[0].num_altsetting;
        if(altesetting > 0)
        {
            endpoint_num = conf_desc->interface[0].altsetting[0].bNumEndpoints;
            if(endpoint_num > 0)
            {
                for(i = 0; i < endpoint_num; i++)
                {
                    endpoint = &conf_desc->interface[0].altsetting[0].endpoint[i];
                    if ((endpoint->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) & \
                            (LIBUSB_TRANSFER_TYPE_BULK | LIBUSB_TRANSFER_TYPE_INTERRUPT))
                    {
                        if (endpoint->bEndpointAddress & LIBUSB_ENDPOINT_IN)
                        {
                            if (!endpoint_in)
                                endpoint_in = endpoint->bEndpointAddress;
                        }
                        else
                        {
                            if (!endpoint_out)
                                endpoint_out = endpoint->bEndpointAddress;
                        }
                    }
                }
            }
        }
    }
//释放配置描述符
    libusb_free_config_descriptor(conf_desc);
//卸载驱动内核
    libusb_set_auto_detach_kernel_driver(handle, 1);
//为指定的设备申请接口
    libusb_claim_interface(handle, 0);

7.读写设备(采用中断模式);

//从buf中发送32个字节出去,超时10ms
int size;
libusb_interrupt_transfer(handle, endpoint_out, buf, 32, &size, 10);
//从usb中读32个字节放入buf中
int read_num = libusb_interrupt_transfer(handle, endpoint_out, buf, 32, &size, 10);

8.通过libusb_release_interface释放设备接口;

libusb_release_interface(dev_handle, 0);

9.通过libusb_close将你之前打开的设备关闭;

libusb_close(dev_handle);

10.通过libusb_exit来关闭对话;

libusb_exit(NULL);

3.1 实例

工程源码已打包上传,欢迎下载。
软件架构
软件主要由两部分组成: 1、libusb的调用和使用; 2、qt图形视图框架的基本使用。

安装教程
使用QT打开工程文件;
修改.pro文件中的库路径;
设置kits,编译运行。

使用说明
主要介绍了libusb的设备打开,端口打开,以及中断方式传输数据;
主要介绍了Qt的视图框架QGraphicsView、QGraphicsScene和QGraphicsItems的基本使用;
利用QT的视图框架进行了基本图形的绘制,比如画点、画线、画矩形等。
链接:link

本文标签: 操作 QT Windows mingw USB