zoukankan      html  css  js  c++  java
  • Qt下libusb-win32的使用(转)

    源:Qt下libusb-win32的使用(一)打印设备描述符

        主要是在前一篇的基础上,学习libusb-win32的API使用。程序很简单,就是打印指定USB设备的设备描述符(当然其他描述符也是可以的)。

    #include "testlibusb.h"
    
    
    #define MY_VID 0x5345
    #define MY_PID 0x1234
    
    
    USB::USB()
    {
        usb_init(); /* initialize the library */
        //usb_set_debug(255);
        usb_find_busses(); /* find all busses */
        usb_find_devices(); /* find all connected devices */
    
        if (!(udev = open_dev())) {
            qDebug("error opening device: %s", usb_strerror());
            exit(1);
        } else
            qDebug("open success: device %04X:%04X opened", MY_VID, MY_PID);
    
        printf_device_descriptor(&dev->descriptor);
        usb_close(udev);
    
        //my_usb_get_device_list();
        resize(320, 240);
    }
    
    usb_dev_handle *USB::open_dev(void)
    {
        struct usb_bus *bus;
        //struct usb_device *dev;
    
        for(bus = usb_get_busses(); bus; bus = bus->next) {
            for(dev = bus->devices; dev; dev = dev->next) {
                if((dev->descriptor.idVendor == MY_VID) && (dev->descriptor.idProduct == MY_PID)) {
                        return usb_open(dev);
                }
            }
        }
        return 0;
    }
    
    void USB::printf_device_descriptor(usb_device_descriptor *desc)
    {
            qDebug("bLength:             %u",     desc->bLength);
            qDebug("bDescriptorType:     %02Xh",  desc->bDescriptorType);
            qDebug("bcdUSB:              %04Xh",  desc->bcdUSB);
            qDebug("bDeviceClass:        %02Xh",  desc->bDeviceClass);
            qDebug("bDeviceSubClass:     %02Xh",  desc->bDeviceSubClass);
            qDebug("bDeviceProtocol:     %02Xh",  desc->bDeviceProtocol);
            qDebug("bMaxPacketSize0:     %02Xh",  desc->bMaxPacketSize0);
            qDebug("idVendor:            %04Xh",  desc->idVendor);
            qDebug("idProduct:           %04Xh",  desc->idProduct);
            qDebug("bcdDevice:           %04Xh",  desc->bcdDevice);
            qDebug("iManufacturer:       %u",     desc->iManufacturer);
            qDebug("iProduct:            %u",     desc->iProduct);
            qDebug("iSerialNumber:       %u",     desc->iSerialNumber);
            qDebug("bNumConfigurations:  %u",     desc->bNumConfigurations);
    }

    这里我指定的USB设备是Tiny6410开发板。运行效果如下:

    下一步就是上位机与开发板进行数据互传。

    源:Qt下libusb-win32的使用(二)批量读写操作

    一、概述

            学习libusb-win32的使用。使用批量传输方式与USB开发板进行数据读、写操作。上位机使用Qt做界面, 使用USB开发板的端点2作为批量传输端点。      

     

    二、实现

            代码比较简单,直接给出,如下:

    #include "testlibusb.h"
    
    //for Tiny6410
    //#define MY_VID 0x5345
    //#define MY_PID 0x1234
    
    //for 51 USB Board
    #define MY_VID 0x8888
    #define MY_PID 0x0001
    
    // Device configuration and interface id.
    #define MY_CONFIG 1
    #define MY_INTF 0
    
    // Device endpoint 2
    #define EP_IN 0x82
    #define EP_OUT 0x02
    
    // Device of bytes to transfer.
    #define BUF_SIZE 64
    
    //#define DEBUG_GUI
    
    
    
    USB::USB()
    {
    #ifndef DEBUG_GUI
    
        usb_init(); /* initialize the library */
        //usb_set_debug(255);
        usb_find_busses(); /* find all busses */
        usb_find_devices(); /* find all connected devices */
    
        if (!(udev = open_dev())) {
            qDebug("error opening device: %s", usb_strerror());
            exit(1);
        } else
            qDebug("open success: device %04X:%04X opened", MY_VID, MY_PID);
    
        printf_device_descriptor(&dev->descriptor);
        my_init_usbdev();
    #endif
    
        textEdit = new QTextEdit(this);
        textEdit->setGeometry(50,20,230,40);
    
        sendButton = new QPushButton(this);
        sendButton->setText("send");
        sendButton->setGeometry(130,80,60,40);
        connect(sendButton,SIGNAL(clicked()),this,SLOT(send_slot()));
    
        readButton = new QPushButton(this);
        readButton->setText("read");
        readButton->setGeometry(130,140,60,40);
        connect(readButton,SIGNAL(clicked()),this,SLOT(read_slot()));
    
        recvLabel = new QLabel(this);
        recvLabel->setText("recv data:");
        recvLabel->setGeometry(20,180,280,40);
    
        //my_usb_get_device_list();
        resize(320, 240);
    }
    
    //关闭程序时被调用
    USB::~USB()
    {
    #ifndef DEBUG_GUI
        qDebug("close usb device.");
        usb_close(udev);
    #endif
    }
    
    //打开指定VID、PID的USB设备
    usb_dev_handle *USB::open_dev(void)
    {
        struct usb_bus *bus;
    
        for(bus = usb_get_busses(); bus; bus = bus->next) {
            for(dev = bus->devices; dev; dev = dev->next) {
                if((dev->descriptor.idVendor == MY_VID) && (dev->descriptor.idProduct == MY_PID)) {
                        return usb_open(dev);
                }
            }
        }
        return 0;
    }
    
    //打印USB设备描述符
    void USB::printf_device_descriptor(usb_device_descriptor *desc)
    {
            qDebug("bLength:             %u",     desc->bLength);
            qDebug("bDescriptorType:     %02Xh",  desc->bDescriptorType);
            qDebug("bcdUSB:              %04Xh",  desc->bcdUSB);
            qDebug("bDeviceClass:        %02Xh",  desc->bDeviceClass);
            qDebug("bDeviceSubClass:     %02Xh",  desc->bDeviceSubClass);
            qDebug("bDeviceProtocol:     %02Xh",  desc->bDeviceProtocol);
            qDebug("bMaxPacketSize0:     %02Xh",  desc->bMaxPacketSize0);
            qDebug("idVendor:            %04Xh",  desc->idVendor);
            qDebug("idProduct:           %04Xh",  desc->idProduct);
            qDebug("bcdDevice:           %04Xh",  desc->bcdDevice);
            qDebug("iManufacturer:       %u",     desc->iManufacturer);
            qDebug("iProduct:            %u",     desc->iProduct);
            qDebug("iSerialNumber:       %u",     desc->iSerialNumber);
            qDebug("bNumConfigurations:  %u",     desc->bNumConfigurations);
    }
    
    //指定USB设备的配置和接口
    void USB::my_init_usbdev()
    {
        //libusb规定下面这两个函数必须要被调用
        if (usb_set_configuration(udev, MY_CONFIG) < 0) {
            qDebug("error setting config #%d: %s", MY_CONFIG, usb_strerror());
            exit(1);
        }
        if (usb_claim_interface(udev, MY_INTF) < 0) {
            qDebug("error claiming interface #%d:
    %s", MY_INTF, usb_strerror());
            exit(1);
        }
    }
    
    //发送按钮响应函数
    void USB::send_slot()
    {
        int ret, num;
        QString s = textEdit->toPlainText();
        QByteArray a = s.toLatin1();
        char *tmp = a.data();
    
        num = s.length();
        //qDebug()<<"text: "<<tmp<<"length: "<<num;
        //批量写(同步)
        ret = usb_bulk_write(udev, EP_OUT, tmp, num, 5000);
        if (ret < 0) {
                qDebug("error writing: %s", usb_strerror());
                exit(1);
        }
    }
    
    //读按钮响应函数
    void USB::read_slot()
    {
        int ret;
        char readdata[BUF_SIZE];
    
        //批量读(同步)
        ret = usb_bulk_read(udev, EP_IN, readdata, sizeof(readdata), 5000);
        if (ret < 0) {
                qDebug("error reading:%s", usb_strerror());
                exit(1);
        }
        readdata[ret] = '';
        //将接收到的数据显示在Label上
        recvLabel->setText("recv: " + QLatin1String(readdata));
    }

    三、结果

            运行上位机程序,在编辑框输入一些字符(数字),然后点击“send”按钮将数据发送给USB设备,点击“read”按钮将USB设备接收到的数据读回到上位机并显示在界面上,效果如下:

  • 相关阅读:
    [Tips] kubeconfig合并
    某书补充题选做
    Card
    Ant Design Pro V5 使用 Cesium 地图开发包遇到加载widgets.css样式报错
    工作相关
    pc端谷歌浏览器长截图
    dao层与xml之间联系
    三周的大学生活,我到底是怎么过来的
    湖南大学推荐书《社会学大纲》阅读有感 其二
    湖南大学新生报到游记 其一
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4571129.html
Copyright © 2011-2022 走看看