第一次写这种文章,不清晰的地方请帮忙指出
QT环境准备
引言
PC环境:window7
网上很多QT的USB访问,使用的是MCVS的环境,我一番使用下来遇到很多问题,
使用C#写USB驱动需要用到LIBUSBDONET这个库,但是这个库需要手动使用内部的工具生成驱动上位机才能访问到,但是我的是标准的HID设备且每次使用都需要安装一下驱动不太适合,所以改用QT使用libusb这个库来绕开这一步直接访问我的HID设备。
做的过程中发现libusb也分好几种方法,像hidapi这个库虽然很方便,但是在WIN7系统上,hid_write方法总是会失败而hid_read正常,查了很久的资料也找不到解决问题的方法。
Libusb0.h这个库也是需要手动用inf-wizard.exe生成驱动之后上位机才能识别,且此工具会更改USB设备的枚举,我的设备正常枚举是这样
经过inf-wizard.exe生成后,HID这个接口消失,卸载了好几遍驱动才恢复回来。
环境介绍
最后选用libusb1.0这个库
配套的头文件是libusb.h
QT使用的环境是5.15.2MinGw32bit,MinGw实际上就是GCC编译,所以对应使用后缀.a的lib
PS:如果使用MCVS的编译器,记得选用liusb-1.0.lib的静态库,最好是32位的。
在QT中导入LIBUSB
我这边的QT是需要ui界面的,所以新建了一个标准的mainwindow的工程,文件结构是
1.放置了需要引用的.a文件和.h文件
2.QT的工程文件
打开对应的.pro文件,导入libUSB的库,是通过路径索引的方法,导入的方法很多,还是推荐直接填写路径的方法,因为-L的方法有时候会出错,看个人选用。
这种导入.h的方法就不需要在Headers文件中再次导入我们的libusb.h文件直接在代码中
#Include”libusb.h”就可以了,如图所示。
QT代码部分
USB初始化
1.初始化
在窗口生成的时候,放入USB初始化的语句,若初始化成功,则res变量值为0,这一步如果出现函数解析错误的报错,就需要检查当前libusb库是否跟编译对应,或者将libusb重新生成一遍。
然后对应在窗口关闭时销毁USB
#include "ui_mainwindow.h"
#include "libusb.h"
#include "self_config.h"
#include <stdio.h>
#include <stdlib.h>
#include <qstring.h>
#include <windows.h>
#include <qdebug.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
int res;
res=libusb_init(NULL);
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
libusb_exit(NULL);
delete ui;
}
USB打印设备
打印所有USB设备,这一步可以检查上位机是否能访问到现在PC上接入的USB设备,如果就要检查是否使用到libusb0.h这种库,因为网上搜索libusb也会搜索到libusb0.h这种库,但是库里面函数名和使用的方法也不一样,几率不是很大,可以用BUS HOUND多多检查。
int find_all_of_devices(void)
{
libusb_device **devs;
ssize_t cnt;
cnt = libusb_get_device_list(NULL, &devs);
print_dev(devs);
}
void print_dev(libusb_device **devs)
{
libusb_device *dev;
int i = 0, j = 0;
uint8_t path[8];
while ((dev = devs[i++]) != NULL)
{
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(dev, &desc);
if (r < 0) {
qDebug("failed to get device descriptor"