QT USB通信--方案选择

本文详细介绍了在Windows环境下使用Qt编写UI程序时,如何通过USB与下位机通信的方法。主要讨论了三种解决方案:利用Windows API、开源库libusb以及libusb-win32,最后选择了适合的hidapi库进行简单、高效的USB通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Windows下用Qt写UI程序,该程序与下位机通过USB进行通信。Qt类库没有自带的USB类,所以采用第三方库来进行USB通信。

对于第三方库的选择,总共有如下几种:

一、如果是在Windows下,那么采用Windows 的API函数去读取USB设备。

二、使用开源库libusb,官方网站是http://www.libusb.org/,在http://sourceforge.net/projects/libusb/http://libusb.info/这上面也有详细的使用说明。从官网上下载源代码,压缩包中的INSTALL文件有安装提示。

三、libusb有针对Windows平台下一个开源库http://sourceforge.net/projects/libusb-win32/http://sourceforge.net/p/libusb-win32/wiki/Home/。这个方案有尝试过,从官网上下载压缩包libusb-win32-bin-1.2.6.0,里面有一个inf-wizard.exe可执行程序,可把指定的USB设备识别成libusb-win32的设备,我们可以直接对那个设备进行读写。但是使用这种方式如果换另外一台电脑,那么还得重新为那个设备安装libusb-win32的驱动,不太方便。

第1步:此处我选择我的鼠标设备;



第2步:配置选中设备的信息;



第3步:libusb-win32为我们刚才选中的设备创建了一个Windiow下的驱动程序,之后我们安装他。



第4步:点击Install now之后,提示驱动安装成功,之后我的鼠标就不能用了。主要是驱动被换了。我们看看安装前和安装后设备管理器的内容。多出来的一个设备我们就可以通过libusb-win32的api去读写了。如果想回去继续用鼠标,把那个驱动卸载掉就行了。





四、使用第三方库hidapi,http://www.signal11.us/oss/hidapi/https://github.com/signal11/hidapi。这个方案是最简单的,代码量少,可移植。不过,正如名字所说,这个只适合hid的USB类。刚好下位机之前已配置成hid设备,那么决定采用这种方案。


上述除第一个方案剩下的三个方案,如果在windows下使用,都需要把相应的dll文件放到相应的目录下且指定lib文件的路径,类似这样。这样在程序中对设备的操作才不会报错。


### 如何在 Qt 中集成或使用 libusb 库 要在 Qt 项目中集成或使用 `libusb` 庿,可以按照以下方法实现: #### 配置环境 为了使 Qt 能够识别并链接到 `libusb` 库,需要先配置项目的构建文件 `.pro` 文件。以下是具体的设置方式[^3]: ```plaintext LIBS += -L/path/to/libusb/library -lusb-1.0 INCLUDEPATH += /path/to/libusb/include DEPENDPATH += /path/to/libusb/include ``` 上述代码片段中的 `/path/to/libusb/...` 是指代安装路径的位置,请将其替换为实际的本地路径。 #### 编写代码示例 下面是一个简单的例子展示如何初始化以及枚举 USB 设备列表: ```cpp #include <QCoreApplication> #include <QDebug> #include <libusb-1.0/libusb.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int initResult = libusb_init(nullptr); if (initResult < 0) { qDebug() << "Failed to initialize libusb"; return EXIT_FAILURE; } libusb_device **devs; ssize_t cnt = libusb_get_device_list(nullptr, &devs); if (cnt < 0) { qDebug() << "Failed to get device list"; libusb_exit(nullptr); return EXIT_FAILURE; } qDebug() << "Number of devices:" << cnt; for(ssize_t i = 0; i < cnt; ++i){ libusb_device *device = devs[i]; struct libusb_device_descriptor desc; int res = libusb_get_device_descriptor(device, &desc); if(res >= 0){ qDebug() << QString("Device %1 VendorID:%2 ProductID:%3").arg(i).arg(desc.idVendor, 4, 16, QLatin1Char('0')).arg(desc.idProduct, 4, 16, QLatin1Char('0')); } } libusb_free_device_list(devs, 1); // unref all devices in list libusb_exit(nullptr); return a.exec(); } ``` 此程序会打印当前连接的所有USB设备及其对应的厂商 ID 和产品 ID[^4]。 #### 常见错误处理 如果遇到无法加载动态库或者找不到符号的情况,可能是因为缺少运行时依赖项或者是编译器选项不匹配引起的。确保开发环境中已经正确安装了对应版本的 `libusb` 动态库,并且其架构(如 x86 或者 x64)要与应用程序一致[^5]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值