QT实现USB通讯

一.概述

QT实现USB通讯这里主要介绍两种方法,一种是通过libusb库来实现usb通讯,一种是通过hidapi库实现通信。

1.介绍libusb库

libusb 是一个 C 库,提供对 USB 设备的通用访问。

可移植的:使用单个跨平台API,它可以访问Linux,macOS,Windows等上的USB设备。

用户模式:应用程序与设备通信不需要特殊特权或提升。

版本无关:支持从 1.0 到 3.1(最新)的所有 USB 协议版本。

代码下载:

libusb GIT仓库:https://github.com/libusb/libusb.git

libusb API接口:https://libusb.sourceforge.io/api-1.0/

libusb 示例:https://github.com/libusb/libusb/tree/master/examples

2.hidapi库介绍

hidapi是一个开源的库,用于与HID (人机接口设备) 类设备进行通信,支持Windows、Linux、FreeBSD和Mac OS X等操作系统。它提供了一个C语言的API,使得开发者可以轻松地与HID类设备进行交互。

hidapi是一个跨平台的库,这意味着你可以使用相同的代码来与不同操作系统上的HID设备进行通信。

hidapi的源代码遵循MIT许可,使得开发者可以自由地使用和修改。

代码下载:

https://gitcode.com/libusb/hidapi/tree/master

3.libusb和hidapi库的区别与选择

他们都是用于处理USB设备的库,但它们有一些关键的区别:

首先,libusb是一个通用的USB设备库,主要用于与USB设备进行通信。它可以用来与大部分USB设备进行数据传输,包括设备配置、数据传输等。libusb提供了对USB设备的底层访问和控制,使得开发者可以编写更复杂的USB设备驱动程序或应用程序。

相比之下,hidapi是一个专门针对HID类设备的库。HID类设备包括键盘、鼠标、触控板等输入设备。hidapi主要用于这些设备的通信和控制,它依赖于libusb库,并提供了更高级别的抽象和接口,使得开发者可以更方便地与这些设备进行交互。

总的来说,如果你需要与USB设备进行底层通信和控制,libusb可能更适合你的需求。而如果你需要与HID类设备进行交互,例如编写一个与鼠标或键盘交互的应用程序,那么hidapi可能更加方便和高效。

二.libusb代码示例

1.头文件

#include "libusb.h"

2.代码示例

#define VENDOR_ID (0x046D)

#define PRODUCT_ID (0xC31D)

int kernelDriverDetached = 0;

unsigned char data_in[64]={0};

int length = 0;

int r,j;

libusb_device_handle *handle;

handle = libusb_open_device_with_vid_pid(NULL, vendor_id, product_id);

if (handle == NULL)

{

qDebug()<<"libusb_open() failed\n";

return -1;;

}

/*驱动必须解绑定,否则数据由驱动程序处理*/

if(libusb_kernel_driver_active(handle, 1))

{

qDebug()<<"Kernel Driver Active\n";

r = libusb_detach_kernel_driver(handle, 1);

if (r == 0)

{

qDebug()<<"Detach Kernel Driver\n";

kernelDriverDetached = 1;

}

else

{

qDebug()<<"Error detaching kernel driver:"<<r;

return -1;;

}

}

/* 指定当前接口 */

r = libusb_claim_interface(handle, 0);

if (r != 0)

{

qDebug()<<"Error claiming interface";

goto exit;

}

while(1)

{

memset(data_in, 0, sizeof(data_in));

/*中断方式读取断点数据,

由端点描述符可知端点地址 0x81 为鼠标输入端点

读取长度为5字节,超时时间为1000ms*/

r = libusb_interrupt_transfer(handle, 0x81, data_in, 5, &length, 1000);

if ((r < 0) || (length == 0))

{

qDebug()<<"bulk recive error"<<r<<length;

}

else

{

qDebug()<<"receive data:";

for(j=0; j<length; j++)

{

qDebug()<<data_in[j];

}

}

QTest::qSleep (1000) ;

}

/* 释放指定的接口 */

r = libusb_release_interface(handle, 0);

if (0 != r)

{

qDebug()<<"Error releasing interface";

}

exit:

if(kernelDriverDetached)

{

//恢复驱动绑定,否则鼠标不可用

libusb_attach_kernel_driver(handle, 0);

}

libusb_close(handle);

return r;

二.hidapi代码示例

  1. 头文件

#include "hidapi.h"

2.代码实现

hid_device *handle;

int res;

unsigned char buf[256];

struct hid_device_info *devs, *cur_dev;

devs = hid_enumerate(0x0, 0x0);

cur_dev = devs;

while (cur_dev) {

qDebug()<<"Device Found:"<< cur_dev->vendor_id<< cur_dev->product_id<< cur_dev->path<< cur_dev->serial_number;

cur_dev = cur_dev->next;

}

hid_free_enumeration(devs);

handle = hid_open(0x046d, 0xc077, nullptr);

if (!handle) {

qDebug()<<"unable to open device\n";

return 1;

}

// Set the hid_read() function to be non-blocking.

hid_set_nonblocking(handle, 1);

// Try to read from the device. There shoud be no

// data here, but execution should not block.

res = hid_read(handle, buf, 8);

for (int i=0;i<8;i++)

{

qDebug()<<"%02X"<<buf[i];

}

四.usb设备详细信息查看工具:USB Device Tree Viewer

USB Device Tree Viewer在微软USB viewer的基础上开发的USB设备信息的神器。可以方便的查看当前电脑连接了哪些usb设备,同时能够列出设备的详细信息。

相关推荐
行十万里人生1 分钟前
Qt 对象树详解:从原理到运用
开发语言·数据库·qt·华为od·华为·华为云·harmonyos
原来是猿7 分钟前
蓝桥备赛(四)- 数组(下)
开发语言·数据结构·c++·算法
心流时间10 分钟前
[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
java·开发语言·jvm
网络安全Ash13 分钟前
Python网络安全脚本
开发语言·python·web安全
.猫的树37 分钟前
Java集合List快速实现重复判断的10种方法深度解析
java·开发语言·list·集合
刀客12343 分钟前
C++ STL(三)list
开发语言·c++
朔北之忘 Clancy1 小时前
2022 年 12 月青少年软编等考 C 语言五级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
折枝寄北1 小时前
(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
c语言·开发语言
m0_748236581 小时前
PHP进阶-在Ubuntu上搭建LAMP环境教程
开发语言·ubuntu·php
CoderCodingNo2 小时前
【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵
开发语言·c++·矩阵