QT上位机开发(usb设备访问)

news2024/11/20 11:19:48

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        利用usb接口访问底层下位机,这是一种很常见的方式。目前比较简单的做法有两种,一种是usb转串口,另外一种是利用libusb访问下位机设备。前面一种看着是usb,其实是串口;后面一种则主要针对mcu等设备。今天,我们借着学习qt的机会,练习下如何利用libusb库进行上位机、下位机的通讯。

1、创建一个widget的qt工程

        创建的目的,主要还是构建一个qt版本,用于编译。

2、usb设备插入到pc

        一旦usb设备插入到电脑当中,我们就可以在设备管理器中发现这个设备。目前为止,因为还没有驱动和这个设备关联,所以设备显示为不可用的状态。

3、给设备安装libusb驱动

        安装驱动的方法比较简单。首先是安装zadig软件。等zadig软件安装好了之后,就可以利用zadig给usb设备安装libusb驱动。这一步非常重要,只有安装了驱动之后,后续我们开发qt上位机的时候,才能利用libusb库操作这个设备。同时,在安装的时候,注意记录一下vendor id号、product id号,编程的时候用得到。

4、安装libusb第三方库

        安装的方法,其实就是利用nuget进行安装的。选中“引用”,右击“管理NuGet程序包”,输入libusb查找即可,选择第一个选项,单击下载,

5、设置include目录路径

        当前情况下,工程是找不到libusb的include地址的,需要手动添加,即,

C:\Users\feixiaoxing\Desktop\QtWidgetsApplication\packages\libusb.1.0.21\src\include

6、设置链接lib库,注意顺便加上目录

        如果缺少这个步骤,待会链接是不会通过的,

C:\Users\feixiaoxing\Desktop\QtWidgetsApplication\packages\libusb.1.0.21\lib\native\x86\libusb-1.0.lib

7、添加源代码

        整个代码倒没有想象得那么复杂。首先初始化libusb,接着打开设备,读取数据,写入数据,关闭设备,关闭libusb。注意一下,这里的读取数据和写入数据,使用的函数都是libusb_bulk_transfer,只不过两者的endpoint不一样,前者是0x81,后者是0x01。

#include <QApplication>
#include <QDebug>
#include <libusb-1.0/libusb.h>

#define VENDOR_ID 0x1234   // vendor id
#define PRODUCT_ID 0xabcd  // product id

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

	// init libusb here
	libusb_context *ctx = nullptr;
	libusb_init(&ctx);

	// open device
	libusb_device_handle *devHandle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID);
	if (devHandle == nullptr) {
		qDebug() << "Failed to open device.";
		libusb_exit(ctx);
		return app.exec();
	}

	// read data
	unsigned char buffer[64];
	int bytesRead = 0;
	int readResult = libusb_bulk_transfer(devHandle, 0x81, buffer, sizeof(buffer), &bytesRead, 1000); // 0x81, read
	if (readResult == 0) {
		qDebug() << "Read data successful. Bytes read: " << bytesRead;

		// add your operation here
	}
	else {
		qDebug() << "Failed to read data. Error code: " << readResult;
	}

	// write data
	const char *dataToWrite = "Hello, USB Device!";
	int bytesWritten = 0;
	int writeResult = libusb_bulk_transfer(devHandle, 0x01, (unsigned char *)dataToWrite, strlen(dataToWrite), &bytesWritten, 1000); // 0x01, write
	if (writeResult == 0) {
		qDebug() << "Write data successful. Bytes written: " << bytesWritten;
	}
	else {
		qDebug() << "Failed to write data. Error code: " << writeResult;
	}

	// close device
	libusb_close(devHandle);

	// shutdown libusb
	libusb_exit(ctx);
	return app.exec();
}

8、调试和测试

        调试的时候,需要提前把libusb的libusb-1.0.dll文件,拷贝到exe的目录下面。不然没有办法启动和调试exe。另外在调试过程中,可以结合mcu上面的串口打印一起调试,这样效果会更好一点,效率也会更高一点。

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

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

相关文章

【期末考试】数据库综合复习宝典

目录 第一章 数据库系统概述 第二章 关系代数 第四章 关系数据库理论 第五章 数据库设计 第六章 数据库管理系统 第八章 事务管理 第一章 数据库系统概述 1.1三级模式 ①外模式&#xff1a;它为特定的应用程序或用户群体提供了一个数据视图&#xff0c;这个视图是独立于…

Qt编译OpenCV

1.CMake下载安装 官网地址&#xff1a;CMake - Upgrade Your Software Build System &#xff08;1&#xff09;下载后双击安装 &#xff08;2&#xff09;进入安装界面&#xff0c;点击【Next】 &#xff08;3&#xff09;同意协议&#xff0c;点击【Next】 &#xff08;4&a…

illustrator脚本 018 自动角线-1

这是一个自动加角线的脚本,来源于网络。 运行方式,先选择对象再执行脚本,无对话框。脚本不在好坏,你觉得对你有用最重要。 脚本中部分可修改选项: //初始化自定义标线的长度,宽度,离岸,出血等参数,可自行修改 lw=0.1*2.834646; //标线宽度 0.1 mm od=3*2.834646; //…

嵌入式软件开发人员有必要学习系统移植的知识吗?【ppt获取见文末】

《从零开始学ARM》的配套视频说明 为了让粉丝更好的学习我的新书里面的知识&#xff0c; 一口君特地录制了配套学习视频&#xff0c; 《从0学ARM第一期》 《从0学ARM第一期》 视频已经免费发布在B站&#xff0c; 而书中除了ARM汇编、裸机开发等知识&#xff0c;还涉及到…

HuiYong.Online 私有化博客系统

HuiYong.Online 私有化博客系统 一站式支持MarkDown、Drawio、XMind 免费、简单、强大... 用思维导图、流程图、写文章、做笔记、记录生活;搭建自己 / 组织 / 公司的知识储备系统;这里就是你所寻找的。 链接 官网&#xff1a;https://huiyong.onlineGithub&#xff1a;http…

【Docker】centos中及自定义镜像,并且上传阿里云仓库可提供使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《【Docker】centos中及自定义镜像&#xff0c;…

【DB】MySQL版本5.7和8的区别,以及升级的注意事项

文章目录 1、MySQL版本5.7和8的区别2、MySQL 5.7升级8 1、MySQL版本5.7和8的区别 在数据库管理系统中&#xff0c;MySQL是一个广泛使用、开源的解决方案。它提供了强大的功能&#xff0c;同时具有优秀的性能和可扩展性。 MySQL 5的发布于2005年&#xff0c;在MySQL数据库的发…

配置CentOS系统以支持静态HTTP服务

CentOS是一个流行的Linux发行版&#xff0c;广泛应用于服务器环境。要配置CentOS系统以支持静态HTTP服务&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Web服务器软件&#xff1a;CentOS自带了Apache HTTP服务器软件&#xff0c;您可以使用以下命令安装它&#xff1…

17_网络编程

文章目录 网络数据传输的基本原理UDP发送端步骤接收端步骤DatagramSocketDatagramPacket举例版本1&#xff1a;发送端发送消息,接收端接收并打印版本2&#xff1a;创建一个NetworkUtils工具类优化版本1版本3&#xff1a;发送端接收端相互发送版本4&#xff1a;使用多线程 TCP客…

SOLID 原则

单一功能原则 单一功能原则&#xff08;Single responsibility principle&#xff09;规定每个类都应该有一个单一的功能&#xff0c;并且该功能应该由这个类完全封装起来。所有它的&#xff08;这个类的&#xff09;服务都应该严密的和该功能平行&#xff08;功能平行&#x…

【GitHub项目推荐--13 个 Python 学习资源】【转载】

近些年&#xff0c;人工智能应用铺天盖地。人脸识别、老照片复活、换脸等应用都得益于人工智能算法。 许多人工智能算法封装的框架基于 Python 语言&#xff0c;这也导致了 Python 的热度只增不减。 Python 简单易学&#xff0c;根据 2020 年 StackOverflow 开发者调查报告显…

Spring boot - Task Execution and Scheduling @Async

SpringBoot的任务执行器 Spring Boot通过auto-configuration机制自动创建了任务执行器Task Execution&#xff0c;因此在SpringBoot项目中&#xff0c;你不需要任何配置、也不需要自己创建Task Execution就可以直接使用它。 Spring Boot通过auto-configuration机制创建的任务…

学会这个技巧,制作电子杂志SOEASY

​电子杂志是一种非常流行的传播方式&#xff0c;它能够以更加生动、直观的方式展示你的品牌和产品。通过电子杂志&#xff0c;你可以将文字、图片、视频等多种元素有机地结合起来&#xff0c;创造出令人难忘的视觉效果。 如果你想制作一本电子杂志&#xff0c;但不知道从何入…

Apache POI 导出Excel报表

大家好我是苏麟 , 今天聊聊Apache POI . Apache POI 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下&#xff0c;POI 都是用于操作 E…

相对原子质量的定义是什么,为什么要引入相对原子质量,相对原子质量是一个比值吗,单位是1吗?和原子实际质量的关系。

问题描述&#xff1a;相对原子质量的定义是什么&#xff0c;为什么要引入相对原子质量&#xff0c;相对原子质量是一个比值吗&#xff0c;单位是1吗&#xff1f;和原子实际质量的关系。 问题解答&#xff1a; 定义&#xff1a;相对原子质量是指元素的一个原子质量相对于碳-12…

街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取

简介 在计算机中&#xff0c;数据存储的介质一直在变化&#xff0c;从最早的穿孔纸带&#xff0c;到现在的固态硬盘。但存储的原理是一直没有变化的&#xff0c;在计算机中&#xff0c;我们所存储的数据&#xff0c;一直都是以二进制的形式被存储存在不同的介质中。 计算机用…

数据在AI任务中的决定性作用:以图像分类为例

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

数据结构——顺序二叉树——堆

1.树的相关概念 在介绍二叉树之前&#xff0c;我们首先要明确树是什么。 树用我们的通常认识来判断应该是一种植物&#xff0c;从根向上生长&#xff0c;分出许多的树枝并长出叶子。对于数据结构中的树而言&#xff0c;其结构也正是从树的特征中剥离出来的。树结构是一种非线性…

求斐波那契数列矩阵乘法的方法

斐波那契数列 先来简单介绍一下斐波那契数列&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &…

Scratch优秀作品飞翔小鸟

程序说明&#xff1a;在无尽的划痕堆中飞驰而过随着你越来越多地飞进迷宫般的街区&#xff0c;平台变得越来越难。 演示视频 scratch飞翔小鸟 其实这就是一个类似像素小鸟的程序&#xff0c;只不过水管角色就地取材&#xff0c;使用scratch里面的积木图片拼成了水管&#xff0…