QT 串口上位机读卡显示

目录

一.   QT创建工程

二.   软件更换图标 

三.   QT打包


一.   QT创建工程

文件新建,选择创建一个桌面QT。

重命名RFID,并选择工程保存路径

 RFID.pro

QT       += core gui serialport
#串行串口greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = RFID
TEMPLATE = appSOURCES += main.cpp\mainwindow.cppHEADERS  += mainwindow.hFORMS    += mainwindow.ui
#使用C++11
CONFIG += c++11

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QSerialPort>
#include <QByteArray>
#include <QTimer>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECT  // Qt 中的宏,支持信号和槽机制public:// 构造函数,初始化 MainWindow 对象explicit MainWindow(QWidget *parent = nullptr);// 析构函数,用于销毁 MainWindow 对象,防止内存泄漏~MainWindow();private slots:// 当发送按钮被点击时执行的槽函数,用于向串口发送数据void on_sendButton_clicked();  // 读取串口接收到的数据,当串口有数据可读时调用void readData();               // 打开或关闭串口,响应打开按钮的点击事件void on_openButton_clicked();  // 扫描可用的串口端口列表,并在界面中显示void scanAvailablePorts();     private:Ui::MainWindow *ui;  // UI 界面类的指针,用于访问 UI 中的控件QSerialPort *serial; // 串口对象的指针,处理与串口相关的通信操作QTimer *scanTimer;   // 定时器指针,用于定时扫描可用的串口// 配置串口参数(如波特率、数据位、停止位等)void configureSerialPort();  // 更新状态栏的消息,提示用户当前串口的状态void updateStatusMessage();  
};#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPortInfo>
#include <QByteArray>
#include <QDebug>
#include <QString>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),serial(new QSerialPort(this)),scanTimer(new QTimer(this))  // 初始化定时器
{ui->setupUi(this);// 设置窗口标题 左上角的setWindowTitle("白卡写卡软件");// 扫描可用的串口connect(scanTimer, &QTimer::timeout, this, &MainWindow::scanAvailablePorts);scanTimer->start(1000); // 每秒扫描一次connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::on_sendButton_clicked);connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::on_openButton_clicked);connect(serial, &QSerialPort::readyRead, this, &MainWindow::readData);// 初次扫描端口scanAvailablePorts();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::scanAvailablePorts()
{QString currentPortName = ui->portComboBox->currentText();bool currentPortStillAvailable = false;ui->portComboBox->clear();const auto serialPortInfos = QSerialPortInfo::availablePorts();for (const QSerialPortInfo &serialPortInfo : serialPortInfos) {ui->portComboBox->addItem(serialPortInfo.portName());if (serialPortInfo.portName() == currentPortName) {currentPortStillAvailable = true;}}// 如果当前选择的端口仍然可用,则重新选择它if (currentPortStillAvailable) {ui->portComboBox->setCurrentText(currentPortName);} else if (ui->portComboBox->count() > 0) {ui->portComboBox->setCurrentIndex(0);}updateStatusMessage();
}void MainWindow::configureSerialPort()
{if (serial->isOpen()) {serial->close();}QString portName = ui->portComboBox->currentText();serial->setPortName(portName);serial->setBaudRate(QSerialPort::Baud115200);  // 设置波特率为 115200serial->setDataBits(QSerialPort::Data8);serial->setParity(QSerialPort::NoParity);serial->setStopBits(QSerialPort::OneStop);serial->setFlowControl(QSerialPort::NoFlowControl);if (serial->open(QIODevice::ReadWrite)) {ui->statusBar->showMessage("串口打开: " + portName);scanTimer->stop();  // 成功打开串口后停止扫描} else {ui->statusBar->showMessage("无法打开串口: " + portName);}
}void MainWindow::on_openButton_clicked()
{configureSerialPort();updateStatusMessage();
}void MainWindow::updateStatusMessage()
{if (serial->isOpen()) {ui->statusBar->showMessage("串口打开: " + ui->portComboBox->currentText());} else {ui->statusBar->showMessage("串口未连接");}
}void MainWindow::on_sendButton_clicked()
{if (!serial->isOpen()) {ui->statusBar->showMessage("串口未连接");return;}// 获取用户输入并转换为字节数组QString inputText = ui->inputLineEdit->text();// 将十进制字符串转换为整数bool ok;int decimalValue = inputText.toInt(&ok);if (!ok) {qDebug() << "Invalid decimal input";return;}// 确保整数值在 0 到 255 之间,因为我们要将其表示为一个字节if (decimalValue < 0 || decimalValue > 255) {qDebug() << "Decimal value out of range (0-255)";return;}// 创建并初始化 QByteArrayQByteArray data(11, 0); // 预先分配 11 个字节并初始化为 0data[0] = static_cast<char>(0x40);data[1] = static_cast<char>(0xA9);data[2] = static_cast<char>(0x00);data[3] = static_cast<char>(0x04);data[4] = static_cast<char>(0x00);data[5] = static_cast<char>(0x00);data[6] = static_cast<char>(0x00);data[7] = static_cast<char>(0x00); // 预留一个位置data[8] = static_cast<char>(0x00);data[9] = static_cast<char>(0x00);data[10] = static_cast<char>(0x0D);// 将整数转换为十六进制字节char hexByte = static_cast<char>(decimalValue);// 将该字节放入 QByteArray 的第八个位置(索引 7)data[7] = hexByte;// 发送数据serial->write(data);
}void MainWindow::readData()
{if (!serial->isOpen()) {ui->statusBar->showMessage("串口未连接");return;}QByteArray receivedData = serial->readAll();// 显示接收到的全部数据(十六进制格式)ui->receivedDataTextEdit->append(receivedData.toHex().toUpper());// 获取第13个字节的数据并显示在特定窗口if (receivedData.size() >= 13) {// 获取第13个字节的数据unsigned char byte13 = static_cast<unsigned char>(receivedData[12]);// 将字节转换为十进制表示int decimalValue = static_cast<int>(byte13);// 将十进制整数转换为字符串QString decimalString = QString::number(decimalValue);// 在特定窗口中显示十进制数据ui->byte13Label->setText(decimalString);}
}

mainwindow.ui

1.选择串口的下拉框(Combo Box) : portComboBox2.打开按钮 : openButton3.写卡号输入框(Line Edit) : inputLineEdit4.写卡按钮 : sendButton5.串口数据窗口(Text Edit) : receivedDataTextEdit6.当前卡号显示 (Label): byte13Label

运行效果:

二.   软件更换图标 

在工程目录新建文件夹resources

 里面放ico格式的图片

iconfont-阿里巴巴矢量图标库

PNG转ICO - 在线转换图标文件

 在 Qt Creator 中,右键单击项目名称并选择"添加新文件" > "Qt" > "Qt Resource File",将资源文件添加到项目中

将资源文件命名为"resources.qrc"

在 Qt Creator 中打开"resources.qrc"文件,右键单击文件并选择"添加前缀"。添加一个名称,例如"/icons"

 

 右键单击新创建的前缀("/icons"),然后选择"添加文件",将步骤 2 中的 `.ico` 文件添加到资源文件中

更新 .pro 文件

 在 Qt Creator 中打开项目的 .pro 文件。

RC_ICONS = resources/rfid.ico

三.   QT打包

以 Release 方式编译生成 exe 程序:

生成的程序运行正常之后,找到项目的生成目录,比如 项目源码路径:C:\Users\Administrator\Desktop\WR\WR\RFID 。
它的项目生成目录是 C:\Users\Administrator\Desktop\WR\build-RFID-Desktop_Qt_5_4_0_MinGW_32bit-Release 。
进入这个文件夹,在进入它的子文件夹 release 里面,找到 RFID.exe,将这个exe 复制到一个新的单独的文件夹里用于发布,比如存到 C:\Users\Administrator\Desktop\WR\WR\Card 文件夹里面。

然后从开始菜单打开 Qt 命令行,

输入命令:cd  C:\Users\Administrator\Desktop\WR\WR\Card
然后使用 windeployqt 工具命令:windeployqt RFID.exe

 打包完成

直接可以运行

封包软件

 打开Enigma Virtual Box,浏览封包的主程序

 点击右下角的“文件选项”按钮,打开“文件选项”窗口,并勾选其中的“压缩文件”,如下图中红框所示。压缩后的单文件会小得多,所以建议勾选。

点击左下角的“增加”按钮,开始增加文件,如下图所示。

确认后

 

点击确定

执行封包

运行

这时候card路径下生成一个新的exe可以发送,也不会少包

链接: https://pan.baidu.com/s/1U9RA7MdLsOJZUqYMW3FUjg?pwd=ff5q 提取码: ff5q 

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

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

相关文章

GD - GDLink的接口引脚杜邦线接触不好,还是自己做一个转接头好些

文章目录 GD - GDLink的接口引脚杜邦线接触不好&#xff0c;还是自己做一个转接头好些概述笔记转接头使用时的连接关系转接头弄个壳子好些在转接头上&#xff0c;将线序转为自己板子SWD的防呆线序 转接头的2x5P线序和看到的GD-LINK2x5P接口相反END GD - GDLink的接口引脚杜邦线…

Xcode报错:Return from initializer without initializing all stored properties

Xcode报错&#xff1a;Return from initializer without initializing all stored properties,self used before all stored properties are initialized 我们自定义 init 方法&#xff0c;在 init 中直接赋值 Binding 会失败,但是直接赋值给Binding类型的变量却正常&#xff…

94 、k8s之rbac

一、rbac----安全机制 赋权机制 集群是按照用户名进行登录&#xff0c;按照项目名称进行命名空间的分类。 配电云主站------62天 8个人 高温补贴 一主2从 user pdyzz pdyzz -n pdyzz 资源空间 pod数量 1.1、k8s的安全机制&#xff1a; apiserver------>集群内和外…

HTML+CSS - 网页布局之网格布局

1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为&#xff0c;包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一&#xff0c;在文档中创建类似于网格的效果&…

【Go】Go语言中延迟函数、函数数据的类型、匿名函数、闭包等高阶函数用法与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Mysql | 知识 | 理解是怎么加锁的

文章目录 一、怎么加行级锁的&#xff1f;二、唯一索引加锁2.1 唯一索引等值查询1、记录存在的情况2、记录不存在的情况 2.2 唯一索引范围查询a. 针对「大于」的范围查询b. 针对「大于等于」的范围查询的情况。c. 「小于」范围查询&#xff0c;记录「不存在」表中的情况d. 「小…

音乐革命:揭秘树莓派如何重塑 Korg 合成器的未来

采用快速紧凑的 Raspberry Pi 计算模块3&#xff08;Raspberry Pi Compute Module 3&#xff09;的简易设置&#xff0c;为Korg备受推崇的高端乐器提供了一种经济高效的解决方案。 解决方案&#xff1a;Compute Module 3 企业规模&#xff1a;大型企业 行业&#xff1a;音乐…

uniapp小程序,使用腾讯地图获取定位

本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题&#xff0c;在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址&#xff1a;uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了&#xff0c;大…

【LeetCode】每日一题 2024_9_14 从字符串中移除星号(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 今天的题目曾经的我做过了 . . . 又是复习的一天 题目&#xff1a;从字符串中移除星号 代码与解题思路 func removeStars(s string) string {// 本题的核心&#xff1a;生成的输入保证总是可以执行题面中…

大数据-136 - ClickHouse 集群 表引擎详解1 - 日志、Log、Memory、Merge

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【绿盟科技盟管家-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

秒懂:父子进程与bash(命令行参数)的关系

情景解析&#xff1a; 执行以下代码&#xff1a; #include<string.h> #include<unistd.h> int g_val 100000;int main() {int key7;printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);sleep(5);pid_t id f…

现代 Web 开发全攻略:Node.js、npm、Webpack、Vue.js 和 Element-UI 的实战指南

现代 Web 开发全攻略&#xff1a;Node.js、npm、Webpack、Vue.js 和 Element-UI 的实战指南 一 . Node.js1.1 什么是 Node.js ?1.2 Node.js 的安装1.3 快速入门1.3.1 控制台输出1.3.2 使用函数1.3.3 模块化编程 二 . npm 包管理器2.1 什么是 npm ?2.2 npm 命令2.2.1 初始化工…

护眼灯品牌排行第一名出炉!盘点2024年世界公认十大护眼灯

中国拥有全球最多的近视人口&#xff0c;我国学生的近视发病率位居世界第二&#xff0c;人数更是居于首位。如今&#xff0c;越来越多的孩子出现近视现象&#xff0c;许多家长认为这是由于繁重的课业和不健康的用眼习惯所致&#xff0c;但实际上&#xff0c;他们往往忽视了一个…

数据分析-前期数据处理

今天找到一份关于医学体检的数据&#xff0c;在数据分析前期工作需要对数据做处理&#xff0c;在这里我们对原始数据做一些处理&#xff0c;将数据处理为可分析的标准数据。下一篇文章做数据的分析。数据想要获取的话可以到我的资源下载。1 数据读取 import pandas as pd data…

SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者

文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一&#xff1a;利用cmd启动SQL server服务 3.方法二&#xff1a;利用SQL Server配置管理器启动SQL server服务 4.方法三&#xff1a;在服务管理器中启动SQL server服务 二、建立数据库…

震撼!AI实时生成游戏,每秒20帧,谷歌扩散模型最新突破一夜爆火,附论文介绍和GitHub代码

震撼&#xff01;AI实时生成游戏&#xff0c;每秒20帧&#xff0c;谷歌扩散模型最新突破一夜爆火&#xff0c;附论文介绍和GitHub代码。 “比Sora还震撼”&#xff0c;AI可以实时生成游戏了&#xff01; 谷歌DeepMind打造出了首个完全AI驱动的实时游戏引擎——GameNGen。 在单…

SpringBoot集成MyBatis-PlusDruid

目录 MyBatis-Plus简介 实例演示 创建Springboot项目 初始化Springboot项目 添加关键依赖 application.properties添加相关配置 启动类 编写实体类 编写mapper接口 条件构造器 分页插件 自定义 SQL 映射 MyBatis-Plus简介 MyBatis-Plus简介‌MyBatis-Plus‌&…

RDD2022 道路瑕疵检测数据集

RDD2022 道路瑕疵数据集 txt标签或者xml标签 一共23767张图片 D00 D01 D20 D40四类 D00纵向裂缝 D10横向裂缝 D20网状裂缝 D40坑洞。 RDD2022 道路瑕疵检测数据集介绍 数据集概述 RDD2022&#xff08;Road Defect Detection 2022&#xff09;是一个专门用于道路瑕疵检测的数…

力扣之1777.每家商店的产品价格

文章目录 1. 1777.每家商店的产品价格1.1 题干1.2 建表1.3 题解1.4 结果截图 1. 1777.每家商店的产品价格 1.1 题干 表&#xff1a;Products -------------------- | Column Name | Type | -------------------- | product_id | int | | store | enum | | price | int | ---…