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设备接收到的数据读回到上位机并显示在界面上,效果如下:

  • 相关阅读:
    Linq to OBJECT延时标准查询操作符
    LINQ to XML
    动态Linq(结合反射)
    HDU 1242 dFS 找目标最短路
    HDu1241 DFS搜索
    hdu 1224 最长路
    BOJ 2773 第K个与m互质的数
    ZOJ 2562 反素数
    2016 ccpc 杭州赛区的总结
    bfs UESTC 381 Knight and Rook
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4571129.html
Copyright © 2011-2022 走看看