libusb的简单使用

使用libusb开发库可以很方便的与usb通信。

在使用这个库之前需要做几件事情

1.libusb的安装

   在ubuntu中使用sudo apt-get isntall libusb* 可以快速的安装,如果想选择性的安装则使用sudo apt-cache search libusb查看要安装的软件包,然后sudo apt-get install ...进行安装

 

2.确定供应商id 和 产品id,通过这两个id可以确定我们的usb设备

 使用lsusb命令查看,然后使用libusb -v查看具体信息

 

3 确定传输方式、输入端点、输出端点

  命令同2

  我的usb是bulk传输方式、输入端点0x86,输出端点0x02

 

4.在项目中添加添加库 -lusb

  不添加的话会出现找不到函数的问题,如果提示找不到usb.h文件很可能是你没安装好libusb库

 

 5.软件完成之后要使用sudo运行程序,不然usb_bulk_write之类的函数会调用失败。

 

6.附上官网地址和帮助文档

官网:http://www.libusb.org/

帮助文档:http://libusb.sourceforge.net/doc/

 

下面看一下bulk的使用例子:

usbhelper.h

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <usb.h>
 4 #include <QtCore/QObject>
 5 #include <QtCore/QString>
 6 #include <QtCore/QStringList>
 7 class UsbHelper : public QObject
 8 {
 9     Q_OBJECT
10 public:
11     UsbHelper();
12     ~UsbHelper();
13 
14     bool InitUsb();
15 
16     bool WriteData(const QString& pBuffer);
17 
18     bool ReadData(QString &pBuffer);
19 
20     bool WaitResponse(int pTimeout, QStringList &pResponseList);
21     
22     void CloseUsb();
23 
24     bool SendCommand(const QString &pCommand, QStringList &pResponseList);
25 private:
26     usb_dev_handle *mUsbHandle;
27     struct usb_device        *mUsbDev;
28 };
View Code

usbhelper.cpp

#include "usbhelper.h"
#include <QtCore/QThread>
#include <QtCore/QByteArray>
#include <QtCore/QTime>

#define IDVENDOR     0x10EE
#define IDPRODUCT     0xAA55

#define ENDPOINT_OUT    0x02
#define ENDPOINT_IN        0x86

UsbHelper::UsbHelper() :
    mUsbHandle(NULL),
    mUsbDev(NULL)
{
}

UsbHelper::~UsbHelper()
{
    CloseUsb();
}

bool UsbHelper::InitUsb()
{
    usb_init();
    usb_find_busses();
    usb_find_devices();

    struct usb_bus *pbus = NULL;
    struct usb_device *pdev = NULL;

     usb_set_debug(255);

    for(pbus=usb_busses;pbus!=NULL;pbus=pbus->next){
        for(pdev=pbus->devices;pdev!=NULL;pdev=pdev->next){
            struct usb_device_descriptor *desc=&pdev->descriptor;
            if(desc->idVendor==0x10EE && desc->idProduct==0xAA55){
                mUsbDev = pdev;
            }
        }
    }
    if(mUsbDev)
    {
        mUsbHandle = usb_open(mUsbDev);
        if(mUsbHandle)
        {
            usb_claim_interface(mUsbHandle,0);
            return true;
        }

    }
    return false;
}

void UsbHelper::CloseUsb()
{
    if(mUsbHandle)
    {
        usb_release_interface(mUsbHandle,0);    
        usb_close(mUsbHandle);
    }
}

bool UsbHelper::ReadData(QString &pBuffer)
{
    return true;
}

bool UsbHelper::WriteData(const QString &pBuffer)
{

    char buff[1024];
    memset(buff, 0, sizeof(buff));
    int ret = usb_bulk_read(mUsbHandle, ENDPOINT_IN, buff, sizeof(buff), 100);
/*    if(ret < 0)
    {
        qDebug("usb_bulk_read error");
        return false;
    }
*/    
    qDebug("pre read:");

    char buffer[1024];
    QString command = pBuffer;
    while(command.length() > 0)
    {
        QString sendcommand = command.left(sizeof(buffer));
        command.remove(0, sizeof(buffer));
        int sendlen = sendcommand.length();
        QByteArray ba = sendcommand.toLatin1();
        memcpy(buffer, ba.data(), sendcommand.length());
        ret = usb_bulk_write(mUsbHandle, ENDPOINT_OUT, buffer, sendlen, 500);
        if(ret < 0)
        {
            qDebug("usb_bulk_write failed");
            return false;
        }
        else
        {
            qDebug("write %s success", buffer);
        }
//        QThread::sleep(1);
    }
    return true;
}

bool UsbHelper::WaitResponse(int pTimeout, QStringList &pResponseList)
{

    qDebug("Enter WaitResponse");
    pResponseList.clear();
    QString line;
    QTime time;
    time.start();
//    while (time.elapsed() < pTimeout) {
    char readedbuffer[1000];
    int readedSize = 1000;
    int ret = usb_bulk_read(mUsbHandle, ENDPOINT_IN, readedbuffer, sizeof(readedbuffer), 300);
    if (ret < 0) {
        qDebug("WaitResponse sub_bulk_read error");
        return false;
    }
    for (int i=0; i<readedSize; i++)
     {
        quint8 byte = readedbuffer[i];
        if (byte == 0x0D) {
            if (! line.isEmpty()) {
                pResponseList.append(line);
                line = "";
            }
        }
        else {
            line += byte;
        }
    }
    if (! line.isEmpty()) {
        pResponseList.append(line);
    }

    //´òÓ¡ÊÕµ½µÄÐÅÏ¢¡£
    foreach (QString command, pResponseList) {
        qDebug("**> %s", qPrintable(command));
    }
    return pResponseList.count() > 0;
}

bool UsbHelper::SendCommand(const QString &pCommand, QStringList &pResponseList)
{
    if(! WriteData(pCommand)) {
        qDebug("Write Data failed");
        return false;
    }
    if(! WaitResponse(100, pResponseList)) {
        qDebug("WaitResponse failed");
        return false;
    }
    if (pResponseList[0] != pCommand) {
        return false;
    }
    return true;
}
View Code

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include <usb.h>
#include <QtCore/QCoreApplication>
#include "usbhelper.h"

int main(int argc, char* argv[])
{
    QCoreApplication app(argc, argv);

    UsbHelper *helper = new UsbHelper;

    if(! helper->InitUsb())
    {
        qDebug("InitUsb failed");
        return -1;
    }
    QStringList strList;
    if(! helper->SendCommand("W", strList))
    {
        qDebug("Send W failed");
        return -1;
    }

    if(! helper->SendCommand("X", strList))
    {
        qDebug("Send X failed");
        return -1;
    }

    if(! helper->SendCommand("Y", strList))
    {
        qDebug("Send Y failed");
        return -1;
    }
    QString command = "C1,00,01,FF,FF,00,00,20,02,20,02,00,04,08,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,FF,FF,FF,00,00,FD,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00";
    if(! helper->WriteData(command)) {
        qDebug("Write Data failed");
        return false;
    }
    if(! helper->WaitResponse(100, strList)) {
        qDebug("WaitResponse failed");
        return false;
    }
    if (strList[0] != "OK") {
        qDebug("send brigntness error");
        return false;
    }
    else
    {
        qDebug("send brigntness success");
    }
    app.exec();
    return 0;
}
View Code

usb.pro

TEMPLATE        = app
LANGUAGE        = c++

QT += gui core

LIBS            += -lusb -ldl

HEADERS =   pvcmbasethread.h \
            pvdvdbstardevicecommunicatethread.h


SOURCES =     main.cpp \
            pvcmbasethread.cpp \
            pvdvdbstardevicecommunicatethread.cpp

unix {
    MOC_DIR = .moc
    OBJECTS_DIR = .obj
}
View Code

 

 

  

转载于:https://www.cnblogs.com/jck34/p/4001428.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libusb 是一个用户空间的 USB 库,它可以帮助我们在 Linux、Windows 和 Mac OS X 等操作系统上访问 USB 设备。下面是一个简单的示例程序,演示如何使用 libusb 读取一个 USB 设备的描述符信息。 首先,我们需要安装 libusb 库。在 Ubuntu 上,可以使用以下命令安装: ``` sudo apt-get install libusb-1.0-0-dev ``` 接下来,我们编写一个 C 语言程序。程序的主要流程如下: 1. 初始化 libusb 库。 2. 打开 USB 设备。 3. 读取设备描述符信息。 4. 关闭 USB 设备。 5. 释放 libusb 库。 程序代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libusb-1.0/libusb.h> int main(int argc, char** argv) { libusb_device_handle* handle = NULL; libusb_context* context = NULL; unsigned char descriptor[1024]; int r; // 初始化 libusb 库 r = libusb_init(&context); if (r < 0) { fprintf(stderr, "libusb_init error %d\n", r); return 1; } // 打开 USB 设备 handle = libusb_open_device_with_vid_pid(NULL, 0x1234, 0x5678); if (handle == NULL) { fprintf(stderr, "libusb_open_device_with_vid_pid error\n"); goto exit; } // 读取设备描述符信息 r = libusb_get_descriptor(handle, LIBUSB_DT_DEVICE, 0, descriptor, sizeof(descriptor)); if (r < 0) { fprintf(stderr, "libusb_get_descriptor error %d\n", r); goto close; } // 打印设备描述符信息 printf("Device Descriptor:\n"); for (int i = 0; i < r; i++) { printf("%02x ", descriptor[i]); if ((i + 1) % 16 == 0) { printf("\n"); } } printf("\n"); close: // 关闭 USB 设备 libusb_close(handle); exit: // 释放 libusblibusb_exit(context); return 0; } ``` 在上面的程序中,我们使用 libusb_open_device_with_vid_pid 函数打开 USB 设备,其中的 VID 和 PID 分别是设备的厂商 ID 和产品 ID。我们使用 libusb_get_descriptor 函数读取设备描述符信息。最后,我们使用 libusb_close 函数关闭 USB 设备,使用 libusb_exit 函数释放 libusb 库。 注意:在运行程序之前,请将 VID 和 PID 替换为你自己的设备的厂商 ID 和产品 ID。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值