源: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();
} 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(, );
} 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 ;
} 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();
} 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(,,,); sendButton = new QPushButton(this);
sendButton->setText("send");
sendButton->setGeometry(,,,);
connect(sendButton,SIGNAL(clicked()),this,SLOT(send_slot())); readButton = new QPushButton(this);
readButton->setText("read");
readButton->setGeometry(,,,);
connect(readButton,SIGNAL(clicked()),this,SLOT(read_slot())); recvLabel = new QLabel(this);
recvLabel->setText("recv data:");
recvLabel->setGeometry(,,,); //my_usb_get_device_list();
resize(, );
} //关闭程序时被调用
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 ;
} //打印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) < ) {
qDebug("error setting config #%d: %s", MY_CONFIG, usb_strerror());
exit();
}
if (usb_claim_interface(udev, MY_INTF) < ) {
qDebug("error claiming interface #%d:\n%s", MY_INTF, usb_strerror());
exit();
}
} //发送按钮响应函数
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, );
if (ret < ) {
qDebug("error writing: %s", usb_strerror());
exit();
}
} //读按钮响应函数
void USB::read_slot()
{
int ret;
char readdata[BUF_SIZE]; //批量读(同步)
ret = usb_bulk_read(udev, EP_IN, readdata, sizeof(readdata), );
if (ret < ) {
qDebug("error reading:%s", usb_strerror());
exit();
}
readdata[ret] = '\0';
//将接收到的数据显示在Label上
recvLabel->setText("recv: " + QLatin1String(readdata));
}

三、结果

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

Qt下libusb-win32的使用(转)的更多相关文章

  1. 【转】Qt下使用glut库

    ps:这个说的很明白,尤其是win10环境下用mingw环境时编程时碰到的问题, 1.加 windows.h 2.在.pro 添加libs     博文地址:Qt下使用glut库   本人使用的环境 ...

  2. VC++或QT下 高精度 多媒体定时器

    在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码 ...

  3. Qt下libusb-win32的使用方法(转)

    源:Qt下libusb-win32的使用方法 之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下 ...

  4. Qt下libusb-win32的使用方法

    之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件. 发现了libusb这个库可以用作无驱 ...

  5. delphi中formatFloat代码初探(在qt下实现floatformat的函数)

    由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...

  6. QT下资源使用和资源占用…(可以动态加载资源文件,这样不占内存)

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  7. windows下实现win32俄罗斯方块练手,编程的几点心得

    编程珠玑2阅读笔记: 1.使用c语言性能监视器,完成对代码的调优工作 2.关联数组:  拓扑排序算法,可以用于当存在遮挡的时候决定三维场景的绘制顺序. 3.小型算法中的测试与调试工具 脚手架程序:&l ...

  8. 关于QT下资源使用和资源占用…

    原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想     最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. h ...

  9. Qt下QString转char*

    Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的 ...

随机推荐

  1. js对象大总结2016/4/19

    本地对象(非静态对象) 常用的对象Object,Funcion,Array,Boolen,String,Boolen,Number,Date,RegEXP,Error;new一下就能用的 内置对象:( ...

  2. JS取非行间样式

    <title>无标题文档</title> <style> #div1{width:200px;height:200px; background:red;} < ...

  3. Linux学习 -- 日志管理

    日志服务 rsyslogd  CentOS6 取代了原来的syslog rsyslogd 默认启动.自启动 常用命令:lastb.lastlog.last.w.who.users. 系统默认日志 和 ...

  4. Swift学习(1)

    swif(1) println("Hello, world") 输出结果: Hello, world swift使用let来声明常量,使用var来声明变量 //变量 var myV ...

  5. 关于this指针理解

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...

  6. Windows API 之 CreateThread、WaitForSingleObject(未完)

    WaitForSingleObject Waits until the specified object is in the signaled state or the time-out interv ...

  7. 随机法解决TSP问题

    TSP问题一直是个头疼的问题,但是解决的方法数不胜数,很多的算法也都能解决.百度资料一大堆,但是我找到了代码比较简练的一种.随机法.下面只是个人的看法而已,如果有任何问题虚心接受. 顾名思义,随机法就 ...

  8. 고서--做完A之后做B, B受A影响

    1. 합격 소식을 듣고서 매우 기뻤어요.. 2. 친구하고 심하게 다투고서 마음이 안 좋았어요. 3. 급한 일을 먼저 끝내고서 이야기합시다.' 4. 창문을 열고서 상쾌한 공기를 마서 ...

  9. 在ubuntu 上创建 ssl 证书

    soap webservice 调试工具: soap UI, 可以下载下来玩一玩. Introduction TLS, or transport layer security, and its pre ...

  10. 模仿 app

    原文链接:http://www.jianshu.com/p/a634b66cb180 前言 作为一个IOS程序员,闲的时候也想自己做一个app练练手,又苦于没有UI设计,也没有好的idea,所以只能先 ...