QT-串口工具

一、演示效果

请添加图片描述

二、关键程序

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow),listPlugins(QList<TabPluginInterface *>()),translator(new QTranslator())
{ui->setupUi(this);tabCOMSimple = new TabCOMSimple(this);ui->tabMain->addTab(tabCOMSimple, tr("Simple"));tabAdvanced = new TabAdvanced(this);ui->tabMain->addTab(tabAdvanced, tr("Advanced"));decoder = new Decoder(this, tabAdvanced->getListProtocals(), tabAdvanced->getEndianess());// [start] Data stream connections.connect(decoder, &Decoder::rawDataReady, tabCOMSimple, &TabCOMSimple::rawDataReady);connect(decoder, &Decoder::frameReady, tabAdvanced, &TabAdvanced::frameDataReady);// [End]// [Start] Pluginsconnect(ui->actionLoad_Plugin, &QAction::triggered, this, &MainWindow::onLoadPluginTriggered);connect(decoder, &Decoder::frameReady, this, &MainWindow::onDecodedDataReady);QString folderString = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/QSerial Socket Amigo";QFileInfo folder(folderString);if (!folder.exists())QDir().mkdir(folderString);folderString.append("/plugins");QFileInfo pluginsFolder(folderString);if (!pluginsFolder.exists())QDir().mkdir(folderString);// [End]// [Start] i18nconnect(ui->actionEnglish, &QAction::triggered, this, &MainWindow::onActionEnglishTriggered);ui->menuLanguage->addAction(tr(u8"简体中文"), this, &MainWindow::onActionChineseTriggered);// [End]ui->groupNetProperties->setDisabled(true);connect(ui->radioSerial, &QRadioButton::clicked, this, &MainWindow::onConnectionTypeChanged);connect(ui->radioNetSocket, &QRadioButton::clicked, this, &MainWindow::onConnectionTypeChanged);connect(ui->buttonOpen, &QPushButton::clicked, this, &MainWindow::openConnection);serialDevice = new SerialDevice(this, ui->comboPorts, ui->buttonRefreshPorts,ui->comboBaudrate, ui->comboDataBits,ui->comboParity, ui->comboStopBits,ui->comboFlowControl);netSocketDevice = new NetSocketDevice(this, ui->inputNetIPAddr, ui->inputNetPort,ui->radioNetTypeTCP, ui->radioNetTypeUDP,ui->radioNetRoleClient, ui->radioNetRoleServer);connect(serialDevice, &SerialDevice::connected, this, &MainWindow::onDeviceConnected);connect(netSocketDevice, &SerialDevice::connected, this, &MainWindow::onDeviceConnected);connect(serialDevice, &SerialDevice::errorDisconnected, this, &MainWindow::onDeviceErrorDisconnected);connect(netSocketDevice, &SerialDevice::errorDisconnected, this, &MainWindow::onDeviceErrorDisconnected);commDevice = serialDevice;// [start] Log stream connections.connect(tabCOMSimple, &TabCOMSimple::log, this, &MainWindow::log);connect(netSocketDevice, &NetSocketDevice::log, this, &MainWindow::log);// [end]translateTo("zh");this->setWindowTitle(u8"串口工具");
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onConnectionTypeChanged(bool isChecked)
{Q_UNUSED(isChecked)if (ui->radioSerial->isChecked()) {ui->groupNetProperties->setDisabled(true);ui->groupSerialProperties->setEnabled(true);commDevice = serialDevice;} else if (ui->radioNetSocket->isChecked()) {ui->groupNetProperties->setEnabled(true);ui->groupSerialProperties->setDisabled(true);commDevice = netSocketDevice;}
}void MainWindow::closeDevice()
{commDevice->close();ui->groupConnSel->setEnabled(true);ui->buttonOpen->setText(tr("Open Connection"));tabAdvanced->setAllowRunning(false);
}void MainWindow::openConnection()
{if (ui->groupConnSel->isEnabled()) {// This acts like sending connect command, device will signals conncted if so.int ret = commDevice->open();if (ret != 0) {return;}} else {closeDevice();}
}// Only when device is really connected.
void MainWindow::onDeviceConnected()
{tabCOMSimple->bindIODevice(commDevice->ioDevice);decoder->setConnection(commDevice->ioDevice);ui->groupConnSel->setDisabled(true);ui->buttonOpen->setText(tr("Close Connection"));tabAdvanced->setAllowRunning(true);
}void MainWindow::onDeviceErrorDisconnected()
{closeDevice();
}void MainWindow::log(QString str)
{ui->textLog->append(str);
}void MainWindow::onLoadPluginTriggered()
{QString pluginsFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation) + "/QSerial Socket Amigo/plugins";
#if defined(Q_OS_WIN)QString type = tr("Dynamic Linked Library (*.dll)");
#elif defined (Q_OS_LINUX)QString type = tr("Shared Library (*.so)");
#else//Not supporting Mac.Q_ASSERT(false);
#endifQString fileName = QFileDialog::getOpenFileName(this,tr("Select Plugin to Load"),pluginsFolder,type);if (fileName.isEmpty())return;else {QPluginLoader loader(fileName);QObject *pluginObject = loader.instance();if (pluginObject) {TabPluginInterface *plugin = qobject_cast<TabPluginInterface *>(pluginObject);plugin->setConnection(currentConnection);listPlugins.append(plugin);QWidget *widget = new QWidget();widget->setLayout(plugin->getLayout());ui->tabMain->addTab(widget, plugin->getName());ui->tabMain->setCurrentIndex(ui->tabMain->count() - 1);} elseQMessageBox::warning(this, tr("error"), tr("plugin read error"));}
}void MainWindow::onDecodedDataReady(int id, QList<double> listValues)
{for (auto plugin : listPlugins)plugin->onFrameUpdated(id, listValues);
}// Two characters locale, eg: en, zh, de.
void MainWindow::translateTo(QString locale)
{QString qmPath = qApp->applicationDirPath().append("/Serial-Amigo_");translator->load(qmPath.append(locale).append(".qm"));qApp->installTranslator(translator);}void MainWindow::retranslateUi()
{ui->tabMain->setTabText(1, QCoreApplication::translate("MainWindow", "Simple"));ui->tabMain->setTabText(2, QCoreApplication::translate("MainWindow", "Advanced"));ui->comboParity->setItemText(0, QCoreApplication::translate("MainWindow", "NoParity"));ui->comboParity->setItemText(1, QCoreApplication::translate("MainWindow", "EvenParity"));ui->comboParity->setItemText(2, QCoreApplication::translate("MainWindow", "OldParity"));ui->comboParity->setItemText(3, QCoreApplication::translate("MainWindow", "SpaceParity"));ui->comboParity->setItemText(4, QCoreApplication::translate("MainWindow", "MarkParity"));ui->comboFlowControl->setItemText(0, QCoreApplication::translate("MainWindow", "No"));ui->comboFlowControl->setItemText(1, QCoreApplication::translate("MainWindow", "Hard"));ui->comboFlowControl->setItemText(2, QCoreApplication::translate("MainWindow", "Soft"));
}void MainWindow::onActionChineseTriggered()
{translateTo("zh");
}void MainWindow::onActionEnglishTriggered()
{translateTo("en");
}void MainWindow::changeEvent(QEvent *event)
{switch (event->type()) {case QEvent::LanguageChange:ui->retranslateUi(this);retranslateUi();break;default:break;}QMainWindow::changeEvent(event);
}void MainWindow::updatePluginConnection()
{for (auto plugin : listPlugins)plugin->setConnection(commDevice->ioDevice);
}

三、下载链接

https://download.csdn.net/download/u013083044/88867720

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

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

相关文章

动态规划--持续更新篇

将数字变成0的操作次数 1.题目 2.思路 在numberOfSteps函数中&#xff0c;首先设置f[0]为0&#xff0c;因为0已经是0了&#xff0c;不需要任何步骤。然后&#xff0c;使用一个for循环从1迭代到输入的整数num。对于每个整数i&#xff0c;如果i是奇数&#xff0c;则将f[i]设置为…

静态时序分析:SDC约束命令set_driving_cell详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在上文中&#xff0c;我们不建议使用set_drive命令而是使用set_driving_cell命令&#xff0c;这是一个描述输入端口驱动能力更精确的方法。因为大多数情况下&…

SpringBoot实现缓存预热的几种常用方案

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

QEMU开发入门

1. 简介 QEMU&#xff08;Quick EMUlator&#xff09;是一个开源的虚拟化软件&#xff0c;它能够模拟多种硬件平台&#xff0c;并在这些平台上运行各种操作系统。QEMU可以在不同的主机架构之间进行虚拟化&#xff0c;例如x86、ARM、PowerPC、Risc-V等。QEMU是一个功能强大且灵…

LabVIEW开发FPGA的高速并行视觉检测系统

LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展&#xff0c;视觉检测在生产线中扮演着越来越重要的角色&#xff0c;尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性&#xff0c;难以满足当前生产需求的高速和高精度要求。为此&#xf…

ACL权限、特殊位与隐藏属性的奥秘

1.2 操作步骤 # 1. 添加测试目录&#xff0c;用户&#xff0c;组&#xff0c;并将用户添加到组 ------------------- [rootlocalhost ~]# mkdir /project[rootlocalhost ~]# useradd zs[rootlocalhost ~]# useradd ls[rootlocalhost ~]# groupadd tgroup[rootlocalhost ~]# g…

软件提示找不到MSVCP140.dll是什么意思,修复MSVCP140.dll丢失的多个方法

msvcp140.dll 文件是 Microsoft Visual C 运行时库的一部分&#xff0c;具体来说它是 Visual Studio 2015 版本编译的C应用程序所依赖的一个动态链接库&#xff08;DLL&#xff09;文件。这个 DLL 文件包含了大量由Microsoft开发的标准C库函数&#xff0c;这些函数对于许多在Wi…

大模型综述总结--第一部分

1 目录 本文是学习https://github.com/le-wei/LLMSurvey/blob/main/assets/LLM_Survey_Chinese.pdf的总结&#xff0c;仅供学习&#xff0c;侵权联系就删 目录如下图 本次只总结一部分&#xff0c;刚学习有错请指出&#xff0c;VX关注晓理紫&#xff0c;关注后续。 2、概述…

红日靶场3

靶场链接&#xff1a;漏洞详情 在虚拟机的网络编辑器中添加两个仅主机网卡 信息搜集 端口扫描 外网机处于网端192.168.1.0/24中&#xff0c;扫描外网IP端口&#xff0c;开放了80 22 3306端口 80端口http服务&#xff0c;可以尝试登录网页 3306端口mysql服务&#xff0c;可…

linux卸载mysql8重装5

目录 背景操作卸载重装配置启动 背景 在linux&#xff08;阿里云ECS&#xff09;安装部署Hive时初始化Hive元数据库&#xff0c;遇到报错前一天两三小时没解决&#xff0c;问题定位为mysql&#xff0c;次日打算重装 操作 卸载 停止 MySQL 服务 systemctl stop mysql yum卸载…

ES6内置对象 - Map

Map&#xff08;Map对象保存键值对&#xff0c;键值均不限制类型&#xff09; 特点&#xff1a; 有序&#xff08;Set集合是无序的&#xff09;&#xff1b;键值对&#xff08;键可以是任意类型&#xff09;&#xff1b;键名不能重复&#xff08;如果重复&#xff0c;则覆盖&…

c编译器学习07:minilisp编译器改造(debug模式支持调试)

问题 原版的minilisp编译器不支持argv输入测试&#xff0c;不方便单步调试。 代码改造目标是既不改变原有程序的各种功能&#xff0c; 又能支持个人习惯的vs单步debug模式。 CMakeLists.txt变更 定义DEBUG宏 解决单步调试源码定位偏差问题 cmake_minimum_required(VERSION …

高级语言期末2012级B卷

1.编写函数&#xff0c;输出任意正整数n的位数&#xff08;n默认为存储十进制的整形变量&#xff09; 例如&#xff1a;正整数13&#xff0c;则输出2,&#xff1b;正整数3088&#xff0c;则输出4 #include <stdio.h>int func(int n) {int count0;while(n>0) {n/10;co…

免费的WP模板网站推荐

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html wordpress免费企业主题 深蓝色经典实用的wordpress网站模板&#xff0c;用wordpress免费企业主题搭建网站。 http…

基于springboot+vue的安康旅游网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

java基础-正则表达式+文件操作+内置包装类

目录 正则表达式去除字符串前后空格&#xff1a;去除每一行中首尾的空格去除开头的 数字_ 文件操作打印当前项目路径获取文件的上级目录/和\读取文件 内置包装类System类常用方法 Number类Integer类常用方法Float和Double 正则表达式 去除字符串前后空格&#xff1a; str.tri…

创建天花——Dynamo for Revit2022

今天我们来聊一个期待已久的功能——生成天花&#xff0c;经过了这么多年的迭代&#xff0c;Revit终于开放了生成天花的API&#xff0c;而且功能还不错&#xff0c;是经过优化的&#xff0c;不过目前我手里还没拿到SDK&#xff0c;就不截图了。 而且新增的天花API不是在Docume…

axios是如何实现的(源码解析)

1 axios的实例与请求流程 在阅读源码之前&#xff0c;先大概了解一下axios实例的属性和请求整体流程&#xff0c;带着这些概念&#xff0c;阅读源码可以轻松不少&#xff01; 下图是axios实例属性的简图。 可以看到axios的实例上&#xff0c;其实主要就这三个东西&#xff1a…

Sora是什么?

文章目录 前言Sora是什么&#xff1f;功能特色优点 缺点Sora模型的工作原理如何使用Sora模型Sora模型的应用场景Sora模型带来的问题虚假信息版权问题 后记 前言 Sora是美国人工智能研究公司OpenAI发布的一款令人惊叹的人工智能文生成视频大模型。近年来&#xff0c;人工智能技…