QT之usb接口开发

来源:互联网 发布:单片机中断程序例子 编辑:程序博客网 时间:2024/04/27 07:49

QT之usb接口开发

本人是第一次使用QT这个开发工具,完全被QT的例子所吸引,里面提供了很多简单而又实用的例子。大笑

QT是一个很好的GUI开发工具,使用QT开发的GUI可以用炫酷来形容,特别是QT可以调用图形处理器,使得图形图像渲染起来更容易,不占用cpu资源。

废话少说,说一下QT开发USB接口,一个能够和外部通信的GUI才是真正实用的。

我们开发USB为了节省时间,可以引用windows自带的hid.dll这个动态库,或者使用libusb.dll这个开源库。

关于什么是dll文件

用一个通俗的说法,其实就是封装着许多函数的集合文件。

我们可以各种语言均可以调用封装在dll中的函数,从而完成对dll文件的使用。

如何查看dll文件中的函数

我们可以使用DLL Export Viewer这个工具查看。

下图是查看HID.dll这个库的截图



如何用QT调用DLL

下面给出我写的一段程序,程序参考了QT的一些例子。程序是运行在QT5.3版本的。
首先要将DLL文件和程序放在同一个目录里。掉用DLL有很多种方法,我仅测试并成功了着一种,首先是要将我们需要的dll定义成QLibray类型,然后用QLibray类的成员函数操作dll文件,下面的例子中使用了libusb的给64位操作系统使用的dll,就是libusb0_x64.dll。通过调用QLibrary中的load()函数可以载入DLL文件。
其中调用dll中函数的时候,使用了指向函数的指针。
下面的语句定义了一个返回值为int的指向函数的指针类型。
typedef int (*Fun)();

定义后可以使用Fun function1;将function1定义为指针。

下面的语句定义了一个返回值为struct usb_bus的指向函数的指针类型。

typedef struct usb_bus *(*Fun_bus)();
下面是源代码。

#include <QApplication>#include <QLibrary>#include <QDebug>#include <QMessageBox>#include "lusb0_usb.h"             //引入头文件typedef int (*Fun)();              //定义函数指针,以备调用typedef struct usb_bus *(*Fun_bus)();struct usb_bus *bus;struct usb_device *dev;int Al;QString temp,temp1;int main(int argc,char **argv){    QApplication app(argc,argv);    QLibrary mylib("libusb0_x64.dll");   //声明所用到的dll文件,并将mylib定义成Qlibrary类 类型    mylib.setLoadHints(QLibrary::ResolveAllSymbolsHint);    int result;    if (mylib.load())                   //判断是否正确加载    {        QMessageBox::information(NULL,"OK","DLL load is OK!");        Fun open=(Fun)mylib.resolve("usb_init");    //援引 usb_init() 函数   initialize the library        if (open)                       //是否成功连接上 open() 函数        {             QMessageBox::information(NULL,"OK","Link to Function is OK!");            result=open();      <span></span>//这里函数指针调用dll中的 open() 函数            qDebug()<<result;        }        else        {            QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");        }        Fun usb_find_busses=(Fun)mylib.resolve("usb_find_busses");// find all busses        usb_find_busses();        Fun usb_find_devices=(Fun)mylib.resolve("usb_find_devices");// find all connected devices        usb_find_devices();        Fun_bus usb_get_busses=(Fun_bus)mylib.resolve("usb_get_busses");// find all connected devices        for (bus = usb_get_busses(); bus; bus = bus->next)        {            //dev = bus->devices;            for (dev = bus->devices; dev; dev = dev->next)            {                Al=dev->descriptor.idVendor;                temp=QString::number(Al,16);                Al=dev->descriptor.idProduct;                temp1=QString::number(Al,16);                QMessageBox::information(NULL,"Got it","VID:PID=0x"+temp+":0x"+temp1);            }        }    }    else        QMessageBox::information(NULL,"NO","DLL is not loaded!");        return 0;  //加载失败则退出28}}

运行结果如下


0 0
原创粉丝点击