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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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上面的串口打印一起调试,这样效果会更好一点,效率也会更高一点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arcgis javascript api4.x加载天地图web墨卡托(wkid:3857)坐标系

效果&#xff1a; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&quo…

BRC20通证的诞生与未来展望!如何导入bitget教程

BRC-20通证是什么&#xff1f; 嘿&#xff01;你知道BRC-20通证吗&#xff1f;这可是比特币区块链上的超级明星&#xff01;它们不依赖智能合约&#xff0c;而是把JSON代码刻在聪上&#xff0c;聪可是比特币的最小单位哦&#xff01;就像在比特币的乐高积木上盖房子&#xff0…

JDK8终将走进历史,Oracle宣布JDK继续免费

目录 前言Oracle 已免费提供 JDKOracle Java SE 产品最新动态 为什么业界中用JDK8那么多Java SE 8 公共更新结束总结 前言 今天想到上个月无意中听闻到的一句话&#xff1a;JDK8之后收费了&#xff0c;所以大家都用JDK8。当时只觉得这个话说得不对&#xff0c;但因为和说话的人…

ubantu系统运维命令,端口相关操作

1、使用sudo ufw status命令查看所有开放的端口&#xff0c;如下图&#xff1a; 2、使用命令sudo ufw allow 8443&#xff0c;打开端口8443.如下图&#xff1a; 3、使用 sudo ufw reload刷新端口配置&#xff0c;如下图&#xff1a;

如何挖掘过期老域名并注册一个 DA 为 10 的高价值老域名

原文来源&#xff1a;https://guomuyu.com/registered-a-high-value-domain.html 最近有一些有意从事外贸的朋友阅读了《2024最新外贸建站&#xff1a;WordPress自建外贸独立站教程》这篇文章。然而&#xff0c;当他们尝试注册与自己所从事行业相关的域名时&#xff0c;却发现…

【电源专题】案例:不同模块同一个管脚默认状态不一样会导致什么异常?

案例背景:在产品设计中,有时候会兼容两个不同供应商同一个方案的模块。比如两个供应商使用的内部方案都是一样的芯片,封装也是兼容的。但是由于专利、LAYOUT方便、软件开发方便等角度来看,可能会存在不同模块供应商的同一个PIN脚对应的芯片内部的管脚不一样。管脚不一样那么…

训练FastestDet(Anchor-Free、参数量仅0.24M),稍改代码使得符合YOLO数据集排布

文章目录 0 参考链接1 准备数据1.1 使用以下代码生成绝对路径的txt文件1.2 在config文件夹下新建一个xxx.names文件 2 配置训练参数3 稍改代码使得符合YOLO数据集排布4 开始训练 0 参考链接 官方的代码&#xff1a;FastestDet 1 准备数据 我已有的数据集排布&#xff1a;&am…

vue3移动端适配

将vue3项目中的 px 单位&#xff0c;自动转换为rem 单位 可以看到这里会根据页面缩小放大变化 需要安装两个插件&#xff0c;看步骤 amfe-flexible --- 默认指向2.2.1版本 npm i -S amfe-flexiblepostcss-pxtorem --- 默认指向6.0.0版本 --save-dev 参数会把依赖包的版本信…

抽象类--java学习笔记

什麽是抽象类&#xff1f; 在java中有一个关键字叫&#xff1a;abstract&#xff0c;它就是抽象的意思&#xff0c;可以用它修饰类、成员方法abstract修饰类&#xff0c;这个类就是抽象类&#xff1b;修饰方法&#xff0c;这个方法就是抽象方法 认识抽象类 抽象类的注意事项…

udf提权

环境&#xff1a; kali:192.168.157.128 linux靶机&#xff1a;192.168.157.130 1.使用nmap对当前网段进行扫描 nmap 192.168.157.0/24 发现靶机IP和开放端口 2.对靶机进行详细的服务探测 -sS&#xff1a;使用 SYN 扫描&#xff08;半开放扫描&#xff09;方式&#xff0c…

webpack执行流程知识点总结

webpack的运行流程 Webpack 的运行流程是一个串行的过程&#xff0c;从启动到结束会依次执行以下流程&#xff1a; 在以上过程中&#xff0c;Webpack 会在特定的时间点广播出特定的事件&#xff0c;插件在监听到感兴趣的事件后会执行特定的逻辑&#xff0c;并且插件可以调用 We…

ArrayBlockingQueue的使用

异步日志打印模型概述 在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了&#xff0c;这是因为打印日志本身是需要写磁盘的&#xff0c;写磁盘的操作会暂时阻塞调用打印日志的业务线程&#xff0c;这会造成调用线程的rt增加。 如图所示为同步日…

docker部署ng实现反向代理

场景 按规定尽可能减少开放到外网的端口&#xff0c;所以需要将多个服务部署到一个ip一个端口上。 方案 使用ng实现请求转发。根据http请求中的host与ng配置文件中的server_name匹配&#xff0c;转发到对应的机器上。 在docker上部署三个容器&#xff0c;每个容器中启动一个…

JavaScript系列——Promise

文章目录 概要Promise三种状态状态改变Promise链式调用Promise处理并发promise.all()promise.allSettled&#xff08;&#xff09;Promise.any()promise.race() 小结 概要 Promise中文翻译过来就是承诺、预示、有可能的意思。 在JavaScript里面&#xff0c;Promise 是一个对象…

2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题 理论技能与职业素养&#xff08;100分&#xff09; 2023年山东省职业院校技能大赛高职组信息安全管理与评估 理论题 【注意事项】 Geek极安云科专注技能竞赛技术提升&#xff0c;基于各大赛项提供全面的系统性…

【JAVA】哪些集合类是线程安全的

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 Vector&#xff1a; HashTable&#xff1a; Collections.synchronizedList()、Collections.synchronizedSet()、Collections.syn…

网络地图服务(WMS)详解

文章目录 1.概述2.GetCapabilities3.GetMap4.GetFeatureInfo 阅读本文之前可参考前文&#xff1a;《地图服务器GeoServer的安装与配置》与《GeoServer发布地图服务&#xff08;WMS、WFS&#xff09;》。 1.概述 经过前文的介绍&#xff0c;相信我们对WMS/WFS服务已经有了一个非…

收银系统源码收银系统OEM定制开发(收银POS+线上商城+ERP+营销插件+聚合支付)

源码&#xff1a;零售行业线下线上一体化收银系统 1.开发语言 核心开发语言: php、HTML5、JavaPHP开发环境&#xff1a;php7.3安卓端收银、助手: 原生的JavaPC收银端: HTML5vuecssjsnwjs微信小程序助手: 原生小程序开发商城: uniapp后合管理网站: HTML5vueelement-uicssjs 2…

基于Java SSM框架实现在线作业管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现在线作业管理系统演示 JSP技术 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了运动员的需求…

day01

文章目录 创建Vue实例插值表达式响应式数据常见标签v-htmlv-show v-ifv-if v-else-if v-elsev-onv-bindv-forv-model 综合案例 创建Vue实例 <!--创建Vue实例&#xff0c;初始化渲染1. 准备容器2. 引包&#xff08;官网&#xff09; — 开发版本/生产版本3. 创建Vue实例 ne…