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
版权声明:本文标题:Windows下采用QT-minGW调用libusb库操作USB 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726532090h979728.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论