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

源:Qt下libusb-win32的使用方法

之前一直找不到适合WIN7下的Tiny6410的USB下载软件,正好这几天开始学习USB,所以打算自己写一个专门用于Tiny6410的WIN7下的USB下载软件。

发现了libusb这个库可以用作无驱USB开发,就是说根本不需要了解Window驱动开发的知识就可以开发USB设备驱动,只需要了解一下USB的相关协议即可。Windows下我几乎不用VS来写程序,或者说我不懂MFC吧,呵呵,所示我用Qt来做界面。好了,进入正题。

首先下载libusb-win32,下载地址:http://sourceforge.net/projects/libusb-win32/files/,注意选择下载的文件是libusb-win32-bin-1.2.6.0.zip,这不是源码,而是一些已经编译好的库。解压之,里面有这么一些文件(夹):

下面简单介绍一下里面的东西是怎么用的。

(1)bin文件夹。里面最重要的是inf-wizard.exe这个程序,当你的USB设备插到电脑上而没有找到驱动程序时就可以通过这个程序来安装通用的USB驱动。双击它,下一步,在里面找到你的USB设备,选中后下一步,最后会弹出一个对话框让你保存它生成驱动程序。这样就有了驱动程序,但还没有安装,可以通过设备管理器来安装,安装成功后就可以通过libusb来编写程序来访问你的USB设备了。

(2)examples文件夹。里面有两个例程,一个简单的,一个复杂的,参考里面的bulk.c例程就好了。

(3)include文件夹。编写程序时需要用到,一般放在你的工程目录下。

(4)lib文件夹。里面是一些已经编译好的库,有borland版本的,有VC++版本的,有x64位版本的,最重要的是还有gcc版本,这里用到的就是gcc版本的,该版本可以在Qt上使用。

下面开始介绍怎么在Qt下使用该库。

1. 新建一个Qt工程

2. 把gcc版本的库文件libusb.a复制到工程目录下(可以放在其他目录),在.pro文件中追加如下一行(路径根据自己的情况修改):

LIBS+="F:/Qt/pratise/libusb-test/libusb/libusb.a"

这样就可以在链接时找到所需的函数。

3. 把上面所说的include文件夹下lusb0_usb.h文件复制到工程目录下。

4. 编写一个测试文件,我这里写的比较简单,程序的功能是只列出我的USB设备,如下:

#include "testlibusb.h"
#include "lusb0_usb.h"

USB::USB()
{
    //usb_set_debug(250);
    usb_init(); /* initialize the library */
    usb_find_busses(); /* find all busses */
    usb_find_devices(); /* find all connected devices */

    my_usb_get_device_list();

    resize(320, 240);
}

void USB::my_usb_get_device_list(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) {
            /* for specified device
            if (dev->descriptor.idVendor == MY_VID
                        && dev->descriptor.idProduct == MY_PID)
            {
                return usb_open(dev);
            }
            */

            qDebug("VID:VID = %x:%x\n", dev->descriptor.idVendor, dev->descriptor.idProduct);

        }
    }

}

好了,运行程序,效果:

最后一行打印出来的正是Tiny6410的USB设备号。

注意:

这只能列出安装了inf-wizard.exe生成的驱动程序的USB设备。一开始的时候我没接上Tiny6410,程序没输出,插上一个U盘,还是没输出,以为是程序或者这个库有问题,纠结了一会,后来灵光一闪,插上开发板试试吧,果然成功了,程序运行结果就如上面所示。

继续学习USB,过2天USB开发板到了就开始实战。

后记:

最开始自己用Delphi 调用libusb 一直查找不到 STM32 做的HID 设备,却可以查找到AVR的开发工具USBASP。这让本人是郁闷,两者不同的是在Win 设备管理器上USBASP 是单独出现的一个设备,而STM23 HID 是出现在“人体学输入设备”组里,显示名是“输入设备”。最可疑的是参照网上例程网友的一个调试工具却可以正常查找到并可发数据,所以一直怀疑是自己程序调用有问题,折腾死了....

最后在网上找到上面这篇文章,提到inf-wizard.exe 的作用。于是按上述操作完成后在Win设备管理里单独显示为一个设备,并且可以正常查找到了。非常感谢广大网友!

所以,现在把文章转过来(前面放了原地址,点一下直达原文),让更多遇到同样问题的网友能看到。

时间: 2024-11-05 11:26:45

Qt下libusb-win32的使用方法(转)的相关文章

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

原文地址:关于QT下资源使用和资源占用内存过多的问题作者:技术成就梦想 最近研究了一下如何从外部动态调用图片的问题,从而研究了图片资源的使用方法.网上最常见的帖子是这个,感觉总结的还不错. http://www.cnblogs.com/lzjsky/archive/2012/08/20/2647471.html 总的来说,就两种方式. 一种就是使用qrc资源文件,也就是在QT的工程中添加资源文件,这个方法比较简单容易操作,对于初学者来说比较容易上手,在资源比较少的时候可以使用.但是也有它的缺点,

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

在VC编程中,用SetTimer可以定义一个定时器,到时间了,就响应OnTimer消息,但这种定时器精度太低了.如果需要精度更高一些的定时器(精 确到1ms),可以使用下面的高精度多媒体定时器进行代码优化,可以达到毫秒级的精度,而且使用方便.先要包含头文件"mmsystem.h"和库文 件"winmm.lib". 虽然Win95下可视化开发工具如VC.Delphi.C++   Builder等都有专用的定时器控件Timer,而且使用很方便,可以实现一定的定时功能,但

Qt下QString转char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个'/0'作为结束符,而采用QString::toLatin1()时会在字符串后面加上'/0' 方法如下: Qs

zz Qt下 QString转char*和char []

以下内容为转载:http://www.cnblogs.com/Romi/archive/2012/03/12/2392478.html ----------------------------------- Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到

Qt下 QString转char*

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个‘/0’作为结束符,而采用QString::toLatin1()时会在字符串后面加上‘/0’ 方法如下: Qs

QT 下opengl (认识)

虽然Qt不以效率著称,但是事实上有足够的优化,最最典型的就是默认的图形双缓冲,按照Windows下的编程惯例是需要手动开启,并通过额外的接口调用才能使用的,这一点在以前简单图形编程学习时比较过Qt,Win32 GDI时感受特别深刻,在没有额外处理的时候,Win32动画程序那个闪阿,而Qt程序非常稳定.事实上,我想,Qt的其他问题比效率严重多了,比如个人感觉Qt程序在Windows下刷新的感知明显没有Windows原生程序快,这点倒是值得改进.OpenGL只处理与3D图形的绘制,基本上不提供创建用

高DPI下界面错乱的解决方法和原理

来源: http://bbs.csdn.net/topics/370177760 我在win32 + c写的界面中解决办法,就是把字体的字号给固定了,这样做的结果就是,不管dpi是否有改变,界面中控件的文字的字号不变,就不会出现文字换行的情况. 但像菜单文字的字号就变大了,combobox(右三角),checkbox(选择框)变大一点点,显的有点不协调. 但至少不影响使用. 下面是判断当前系统的dpi,然后重置字体的字号. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Qt下 QString转char*(转)

Qt下面,字符串都用QString,确实给开发者提供了方便,想想VC里面定义的各种变量类型,而且函数参数类型五花八门,经常需要今年新那个类型转换 Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 在Qt下怎样将QString转char*呢,需要用到QByteArray类,QByteArray类的说明详见Qt帮助文档. 因为char*最后都有一个'/0'作为结束符,而采用QString::toLatin1()时会在字符串后面加上'/0' 方法如下: Qs

Qt下使用QDebug打印指针地址

Qt下使用QDebug打印指针地址,是个很好用的方法. qDebug()<<"parent--1"<<this->parent(); 输出为: 指针的输出精确的解释了指针的物理地址(待商榷),以及指针的类型. //---------------------------------------------- 我遇到的问题, 我把一个子Widget放到了一个父Widget中, 并且在这个父Widget中添加了一个QScrollArea,把子Widget放到了Q