Lv.的博客

Ubuntu15下Qt+libusb开发

 

下载和安装libusb-1.0

在Ubuntu15中可以从软件仓库安装libusb,当前的libusb版本为1.0。可以使用如下命令安装libusb的全部内容。
$sudo apt-get install libusb*
在Ubuntu15.04中,libusb-1.0的头文件和库文件分别被安装在“/usr/include/libusb-1.0”“/usr/lib/x86_64-linux-gnu”目录下。

Qt Creator配置和使用libusb-1.0

使用Qt Creator创建项目,然后在工程文件(*.pro)中添加如下内容:

INCLUDEPATH += /usr/include/libusb-1.0
LIBS += -L"/usr/lib/x86_64-linux-gnu" -lusb-1.0
  • 1
  • 2

测试程序

一个打开、关闭、读写USB HID设备的示例代码如下。
qtusbtes.h

#ifndef QTUSBTES_H
#define QTUSBTES_H

#include <QMainWindow>
#include <libusb.h>

namespace Ui {
class QtUSBTes;
}

class QtUSBTes : public QMainWindow
{
    Q_OBJECT

public:
    explicit QtUSBTes(QWidget *parent = 0);
    ~QtUSBTes();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::QtUSBTes *ui;
    struct libusb_config_descriptor *conf_desc;
    quint8 endpoint_in, endpoint_out;
    libusb_device *dev;
    int OutSize;
    libusb_device_handle *handle;

    void print_devs(libusb_device **devs);
};

#endif // QTUSBTES_H

 

qtusbtes.cpp

#include "qtusbtes.h"
#include "ui_qtusbtes.h"
#include <QDebug>

QtUSBTes::QtUSBTes(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::QtUSBTes)
{
    ui->setupUi(this);

    ui->pushButton_2->setText("打开");
}

QtUSBTes::~QtUSBTes()
{
    delete ui;
}

void QtUSBTes::on_pushButton_clicked()
{
    unsigned char intTransData[2] = {0xAA, 0x55};
    OutSize = sizeof(intTransData);
    int intTrans = libusb_interrupt_transfer(handle, endpoint_in,  intTransData, OutSize, &OutSize, 5000);
    if (intTrans >= 0)
    {
        ;
    }
    else
    {
        return;
    }
    intTransData[0] =  0x01;    /**< 如果使用了 REPORT_ID 则 USB 发送数据缓冲区第一个字节必须为 REPORT_ID 以告知系统该数据属于哪个 ID */
    intTransData[1] =  0x01;
    intTrans = libusb_interrupt_transfer(handle, endpoint_out,  intTransData, OutSize, &OutSize, 5000);
    if (intTrans >= 0)
    {
        ;
    }
    else
    {
        return;
    }
    intTransData[0] =  0x02;    /**< 如果使用了 REPORT_ID 则 USB 发送数据缓冲区第一个字节必须为 REPORT_ID 以告知系统该数据属于哪个 ID */
    intTransData[1] =  0x01;
    intTrans = libusb_interrupt_transfer(handle, endpoint_out,  intTransData, OutSize, &OutSize, 5000);
    if (intTrans >= 0)
    {
        ;
    }
    else
    {
        return;
    }
    intTrans = intTrans;
    OutSize = OutSize;
}

void QtUSBTes::on_pushButton_2_clicked()
{
    if("打开"==ui->pushButton_2->text())
    {
        ui->pushButton_2->setText("关闭");

        int r;

        r = libusb_init(NULL);
        if (r < 0)
            return;

        handle = libusb_open_device_with_vid_pid(NULL, 1155, 22352);
        dev = libusb_get_device(handle);

        libusb_get_config_descriptor(dev, 0, &conf_desc);
        for(int i=0; i<conf_desc->bNumInterfaces; i++)
        {
            for (int j=0; j<conf_desc->interface[i].num_altsetting; j++)
            {
                for (int k=0; k<conf_desc->interface[i].altsetting[j].bNumEndpoints; k++)
                {
                    const struct libusb_endpoint_descriptor *endpoint = &conf_desc->interface[i].altsetting[j].endpoint[k];
                    if (endpoint->bEndpointAddress & LIBUSB_ENDPOINT_IN)
                    {
                        endpoint_in = endpoint->bEndpointAddress;
                    }
                    else
                    {
                        endpoint_out = endpoint->bEndpointAddress;
                    }
                }
            }
        }
        r = libusb_set_configuration(handle, 1);
        if (r < 0)
            return;
        libusb_get_config_descriptor(dev, 0, &conf_desc);
        ui->pushButton->setEnabled(true);
    }
    else
    {
        ui->pushButton_2->setText("打开");
        libusb_free_config_descriptor(conf_desc);
        libusb_close(handle);
        libusb_exit(NULL);
        ui->pushButton->setEnabled(false);
    }
}

 

运行界面如下:
这里写图片描述

posted @   Avatarx  阅读(1652)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示