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

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

#include "testlibusb.h"#define MY_VID 0x5345
#define MY_PID 0x1234USB::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);} elseqDebug("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_GUIusb_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);} elseqDebug("open success: device %04X:%04X opened", MY_VID, MY_PID);printf_device_descriptor(&dev->descriptor);my_init_usbdev();
#endiftextEdit = 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_GUIqDebug("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:\n%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] = '\0';//将接收到的数据显示在Label上recvLabel->setText("recv: " + QLatin1String(readdata));
}

三、结果

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

Qt下libusb-win32的使用(转)相关推荐

  1. Qt下的OpenGL 编程(3)绘制平面几何体

    一. 提要 之前的一篇教程已经搭建好了Qt下的OpenGL的编程环境,几天要来学习的就是OpenGL的2D绘图. 2D作为绘图的基础,还是很值得去好好学习,比如迪卡尔坐标,透视设置等等,而所谓的3D, ...

  2. libusb win32简介以及应用

    1.libusb win32 作用以及安装步骤. LibUSB-Win32是一个用于Windows操作系统(Win98SE.WinME.Win2k和WinXP.Vista.Win7等)上的通用USB设 ...

  3. Qt下使用vs编译的库文件

    Qt下调用VS制作的静态库    1.制作静态库的编译器和Qt版本的编译器是一样     如果是使用Visual Studio 制作的静态库,比如使用Visual Studio 2013制作的,而要使 ...

  4. libusb系列-002-Windows下libusb源码编译

    libusb系列-002-Windows下libusb源码编译 文章目录 libusb系列-002-Windows下libusb源码编译 摘要 Windows下编译libusb库 下载源码 进入msv ...

  5. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  6. Qt下一行代码就可以使用的稳定易用的日志log类

    Qt下一行代码就可以使用的稳定易用的日志类 此日志类是基于Qt 自带的 扩展的一个易用的日志类, 使用的是Qt自带的日志输出形式, 已长期运行在许多实际项目中,稳定可靠,而且跨平台, 在windows ...

  7. Qt下使用Shader绘制三角形

    在Qt下使用可编程管线编写OpenGL的流程是怎样的呢? 下面演示了Qt下使用可编程管线的基本代码:(绘制三个不同的三角形,并做些旋转变换) 在Qt中,我们从QGLWidget继承,来实现OpenGL ...

  8. Qt下使用OpenCV3打开摄像头并把图像显示到QLabel上

    前言 1.Qt5有自己摄像头的类QCamera,但是图像处理相关还是要使用OpenCV来做,这里我演示在Qt下使用OpenCV打开摄像头. 2.Qt的版本是5.9,Qt Creator 4.4.1,O ...

  9. Qt下Tcp传输文件

    Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...

最新文章

  1. 按下开机键,计算机背后的故事
  2. 宜人贷,指旺理财,投米网有什么不一样?
  3. 2021CVPR冠军图像分割算法全解密
  4. Anisble中的任务执行控制
  5. 数据结构--跳表SkipList
  6. hdu 3641 数论 二分求符合条件的最小值数学杂题
  7. 计算机偏门术语,没听说过 WinXP偏门应用技巧四则
  8. jquery中如何表达本页网址_如何用js得到当前页面的url信息方法(JS获取当前网址信息)...
  9. 读写自旋锁详解:TODO
  10. SFTP服务的使用!!
  11. 18.模板引擎(2)
  12. android 恢复出厂设置不清除的分区,Android如何在恢复出厂设置时不删除掉/data/media/0/里面指定的目录...
  13. 华创e路航固件_华创e路航地图升级
  14. 什么是边缘计算网关?(边缘计算网关产品的特点?)
  15. 【转】selenium怎样定位web提示语
  16. 喜讯 | 图扑科技再获厦门数字经济创新创业大赛一等奖
  17. 读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
  18. python educoder苹果梨子_pythoneducoder苹果梨子煮水的功效_苹果梨子汤的功效
  19. 利用Shell 脚本导出sql表格并邮寄发送
  20. java hdms_网盘预研 - ZICK_ZEON的个人空间 - OSCHINA - 中文开源技术交流社区

热门文章

  1. 计算机控制z反变换公式,计算机控制技术第二章Z变换及Z传递函数.ppt
  2. Unity 场景中 模型黑色
  3. 虚拟内存的最大容量与实际容量区别
  4. windows的pagefile.sys是什么文件?pagefile.sys文件太大如何移动到D盘中?
  5. Flink从入门到精通系列(四)
  6. pv lv vg代表的意义
  7. 软件设计概念-指导原则|Aspects|设计元素
  8. 搜索专练测试 3.2
  9. 办公网及办公网计算机,慧点科技数字化智能OA WE.Office协同办公平台”亮相2021 CCF计算机大会...
  10. Qt编写安防视频监控系统9-自动隐藏光标