Qt下libusb-win32的使用(转)
源: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的使用(转)相关推荐
- Qt下的OpenGL 编程(3)绘制平面几何体
一. 提要 之前的一篇教程已经搭建好了Qt下的OpenGL的编程环境,几天要来学习的就是OpenGL的2D绘图. 2D作为绘图的基础,还是很值得去好好学习,比如迪卡尔坐标,透视设置等等,而所谓的3D, ...
- libusb win32简介以及应用
1.libusb win32 作用以及安装步骤. LibUSB-Win32是一个用于Windows操作系统(Win98SE.WinME.Win2k和WinXP.Vista.Win7等)上的通用USB设 ...
- Qt下使用vs编译的库文件
Qt下调用VS制作的静态库 1.制作静态库的编译器和Qt版本的编译器是一样 如果是使用Visual Studio 制作的静态库,比如使用Visual Studio 2013制作的,而要使 ...
- libusb系列-002-Windows下libusb源码编译
libusb系列-002-Windows下libusb源码编译 文章目录 libusb系列-002-Windows下libusb源码编译 摘要 Windows下编译libusb库 下载源码 进入msv ...
- linux+Qt 下利用D-Bus进行进程间高效通信的三种方式
linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...
- Qt下一行代码就可以使用的稳定易用的日志log类
Qt下一行代码就可以使用的稳定易用的日志类 此日志类是基于Qt 自带的 扩展的一个易用的日志类, 使用的是Qt自带的日志输出形式, 已长期运行在许多实际项目中,稳定可靠,而且跨平台, 在windows ...
- Qt下使用Shader绘制三角形
在Qt下使用可编程管线编写OpenGL的流程是怎样的呢? 下面演示了Qt下使用可编程管线的基本代码:(绘制三个不同的三角形,并做些旋转变换) 在Qt中,我们从QGLWidget继承,来实现OpenGL ...
- Qt下使用OpenCV3打开摄像头并把图像显示到QLabel上
前言 1.Qt5有自己摄像头的类QCamera,但是图像处理相关还是要使用OpenCV来做,这里我演示在Qt下使用OpenCV打开摄像头. 2.Qt的版本是5.9,Qt Creator 4.4.1,O ...
- Qt下Tcp传输文件
Qt下Tcp传输文件 文章目录 Qt下Tcp传输文件 1.服务端 2.客户端 1.服务端 //ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVER ...
最新文章
- 按下开机键,计算机背后的故事
- 宜人贷,指旺理财,投米网有什么不一样?
- 2021CVPR冠军图像分割算法全解密
- Anisble中的任务执行控制
- 数据结构--跳表SkipList
- hdu 3641 数论 二分求符合条件的最小值数学杂题
- 计算机偏门术语,没听说过 WinXP偏门应用技巧四则
- jquery中如何表达本页网址_如何用js得到当前页面的url信息方法(JS获取当前网址信息)...
- 读写自旋锁详解:TODO
- SFTP服务的使用!!
- 18.模板引擎(2)
- android 恢复出厂设置不清除的分区,Android如何在恢复出厂设置时不删除掉/data/media/0/里面指定的目录...
- 华创e路航固件_华创e路航地图升级
- 什么是边缘计算网关?(边缘计算网关产品的特点?)
- 【转】selenium怎样定位web提示语
- 喜讯 | 图扑科技再获厦门数字经济创新创业大赛一等奖
- 读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
- python educoder苹果梨子_pythoneducoder苹果梨子煮水的功效_苹果梨子汤的功效
- 利用Shell 脚本导出sql表格并邮寄发送
- java hdms_网盘预研 - ZICK_ZEON的个人空间 - OSCHINA - 中文开源技术交流社区
热门文章
- 计算机控制z反变换公式,计算机控制技术第二章Z变换及Z传递函数.ppt
- Unity 场景中 模型黑色
- 虚拟内存的最大容量与实际容量区别
- windows的pagefile.sys是什么文件?pagefile.sys文件太大如何移动到D盘中?
- Flink从入门到精通系列(四)
- pv lv vg代表的意义
- 软件设计概念-指导原则|Aspects|设计元素
- 搜索专练测试 3.2
- 办公网及办公网计算机,慧点科技数字化智能OA WE.Office协同办公平台”亮相2021 CCF计算机大会...
- Qt编写安防视频监控系统9-自动隐藏光标