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设备,同时能够列出设备的详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、防御保护---信息安全概述

一、网络安全防御---信息安全概述 1.信息安全现状及挑战1.1 网络空间安全市场在中国&#xff0c;潜力无穷1.2 数字化时代威胁升级1.3 传统安全防护逐步失效1.4 安全风险能见度不足1.5 缺乏自动化防御手段1.6 网络安全监管标准愈发严苛 2.信息安全概述2.1 简介2.2 常见的网络安全…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式&#xff08;Proxy Pattern&#xff09; 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁&#xff0c;但不推荐) 2.基于CGLIB实现 spring中应用 …

uniapp使用自定义组件

tt.vue中使用video-player组件 用到的目录如下&#xff1a; pages.json {"path": "pages/Tabbar/tt/tt","style": {"navigationBarTitleText": "","enablePullDownRefresh": false,// 使用自定义组件"using…

C++ 类定义

C 类定义 定义一个类需要使用关键字 class&#xff0c;然后指定类的名称&#xff0c;并类的主体是包含在一对花括号中&#xff0c;主体包含类的成员变量和成员函数。 定义一个类&#xff0c;本质上是定义一个数据类型的蓝图&#xff0c;它定义了类的对象包括了什么&#xff0…

【论文阅读笔记】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

1.介绍 Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation Swin-Unet&#xff1a;用于医学图像分割的类Unet纯Transformer 2022年发表在 Computer Vision – ECCV 2022 Workshops Paper Code 2.摘要 在过去的几年里&#xff0c;卷积神经网络&#xff…

x-cmd pkg | dasel - JSON、YAML、TOML、XML、CSV 数据的查询和修改工具

目录 简介首次用户快速实验指南基本功能性能特点竞品进一步探索 简介 dasel&#xff0c;是数据&#xff08;data&#xff09;和 选择器&#xff08;selector&#xff09;的简写&#xff0c;该工具使用选择器查询和修改数据结构。 支持 JSON&#xff0c;YAML&#xff0c;TOML&…

CentOS 7 安装配置MySQL

目录 一、安装MySQL​编辑​编辑 1、检查MySQL是否安装及版本信息​编辑 2、卸载 2.1 rpm格式安装的mysql卸载方式 2.2 二进制包格式安装的mysql卸载 3、安装 二、配置MySQL 1、修改MySQL临时密码 2、允许远程访问 2.1 修改MySQL允许任何人连接 2.2 防火墙的问题 2…

TCP三握四挥(面试需要)

TCP建立连接需要三次握手过程&#xff0c;关闭连接需要四次挥手过程 三次握手 从图中可以看出&#xff0c;客户端在发起connect时&#xff0c;会发起第一次和第三次握手。服务端在接收客户端连接时&#xff0c;会发起第二次握手。 这三次握手&#xff0c;都会通过SYNACK的方式…

基于ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模教程

详情点击链接&#xff1a;基于ChatGPT4Python近红外光谱数据分析及机器学习与深度学习建模教程 第一&#xff1a;GPT4 1、ChatGPT&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别&#xff0c;以及与…

20240122在WIN10+GTX1080下使用字幕小工具V1.2的使用总结(whisper)

20240122在WIN10GTX1080下使用字幕小工具V1.2的使用总结 2024/1/22 19:52 结论&#xff1a;这个软件如果是习作&#xff0c;可以打101分&#xff0c;功能都实现了。 如果作为商业软件/共享软件&#xff0c;在易用性等方面&#xff0c;可能就只能有70分了。 【百分制】 可选的改…

2017年认证杯SPSSPRO杯数学建模A题(第二阶段)安全的后视镜全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 A题 安全的后视镜 原题再现&#xff1a; 汽车后视镜的视野对行车安全非常重要。一般来说&#xff0c;汽车的后视镜需要有良好的视野范围&#xff0c;以便驾驶员能够全面地了解车后方的道路情况。同时&#xff0c;后视镜也要使图像的畸变尽可能…

Centos升级gcc版本

步骤1&#xff1a;查看当前服务器gcc版本 gcc –version 步骤2&#xff1a;查看当前gcc安装目录 find / -name gcc cd /usr/bin ll gcc* 因为gcc&#xff0c;g&#xff0c;c都是配套的,查找出 g和c的原版本位置 步骤3&#xff1a;安装下载依赖包 yum install glibc-heade…

yolov8 opencv dnn部署 github代码

源码地址 本人使用的opencv c github代码,代码作者非本人 实现推理源码中作者的yolov8s.onnx 推理条件 windows 10 Visual Studio 2019 Nvidia GeForce GTX 1070 opencv4.7.0 (opencv4.5.5在别的地方看到不支持yolov8的推理&#xff0c;所以只使用opencv4.7.0) c部署 环境…

竞赛保研 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

Maven《四》-- 基于Idea进行Maven工程构建

目录 &#x1f436;4.1 构建概念和构建过程 &#x1f436;4.2 命令方式项目构建 1. &#x1f959;编译&#xff1a;mvn compile 2. &#x1f959;清理&#xff1a;mvn clean 3. &#x1f959;打包&#xff1a;mvn package 4. &#x1f959;安装&#xff1a;mvn install …

泰迪科技最新大数据法律监督模型解决方案

大数据法律监督平台是基于监督数据整合管理平台、监督模型构建平台、内置模型库以及法律监督线索管理平台打造的一套服务于检察机关法律监督工作的专业化系统。通过数据采集、融合、挖掘、建模、展现等一系列能力&#xff0c;辅助检察官从纷繁复杂的数据中&#xff0c;开展多维…

java遍历(for和forEach)

1.dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {r…

Python中的函数(二)

1 闭包与装饰器 1.1 闭包 闭包&#xff08;Closure&#xff09;是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数作用域中的变量。闭包可以在外部函数执行完毕后&#xff0c;仍然保持对外部函数作用域的引用&#xff0c;从而可以继续访问和操作外部函…

【Java】--网络编程:基于TCP协议的网络通信

【Java】–网络编程&#xff1a;基于TCP协议的网络通信 文章目录 【Java】--网络编程&#xff1a;基于TCP协议的网络通信一、TCP协议1.1 概念1.2 三次握手1.2.1 文字描述1.2.2 画图演示 1.3 四次挥手1.3.1 文字描述1.3.2 画图演示 二、基于TCP的Socket网络编程2.1 概念2.2 服务…

Kafka-服务端-网络层

Reactor模式 Kafka网络层采用的是Reactor模式&#xff0c;是一种基于事件驱动的模式。熟悉Java编程应该了解JavaNIO提供了实现Reactor模式的API。常见的单线程Java NIO的编程模式如图所示。 为了满足高并发的需求&#xff0c;也为了充分利用服务器的资源&#xff0c;服务端需要…