基于Qt的上位机通讯库

1.前言

做Qt上位机已经有两年的时间了,上位机主要是和下游器件打交道的,通过modbus、tcp、串口等协议来控制这些设备,通过一定的时序控制,完成所需要的工作流程。这其中最重要的就是通讯了,上位机开发过程中的相当一部分问题都是通讯问题导致的。如何总结、抽象出一套稳定的通讯逻辑,在上位机开发中尤为重要。

2.几种通讯类型

这里参考zmq的几种通讯场景,分别是Requester/ResponderPublisher/Subscriber,还有最常用的modbus协议。通过将制定统一的通讯接口,实现了基于串口、网口的两种通讯具体实现,基本可以满足大部分的上位机通讯场合。
在这里插入图片描述

2.1.Requester/Responder 模式

Requester/Responder 模式

适用场景

  • 客户端与服务端之间的点对点通信。
  • 操作需要明确的响应,例如 设备控制、查询状态。
  1. Requester
  • 负责发起请求,等待响应。
  • 需要定义请求的超时和重试机制。
  • 支持不同底层协议(如TCP、UDP、Serial)
class BaseRequester : public BaseCommunication
{Q_OBJECT
public:explicit BaseRequester(QObject *parent = nullptr);public:virtual QByteArray request(QByteArray data);virtual bool requestNoReply(QByteArray data);public slots:
};
  1. Responder
  • 负责接收请求并返回响应。
  • 需要支持请求解析和响应生成逻辑。
class BaseResponder : public BaseCommunication
{Q_OBJECT
public:explicit BaseResponder(QObject *parent = nullptr);signals:void onRequest(QByteArray data);public:virtual void response(QByteArray data);public slots:
};

2.2.Publisher/Subscriber 模式

适用场景

  • 多对多的消息分发,例如 日志广播、实时监控、状态推送。
  • 数据流量较大,不需要逐条确认的场景。
  1. Publisher
  • 负责发布消息给多个订阅者。
  • 支持主题或频道的概念,用于区分消息类别。
class BasePublisher : public BaseCommunication
{Q_OBJECT
public:explicit BasePublisher(QObject *parent = nullptr);virtual bool publish(QByteArray data);signals:public slots:
};
  1. Subscriber
  • 负责接收感兴趣的消息。
  • 支持动态订阅和取消订阅。
class BaseSubscriber : public BaseCommunication
{Q_OBJECT
public:explicit BaseSubscriber(QObject *parent = nullptr);signals:void receive(QByteArray msg);public slots:
};

2.3.Modbus

class BaseModbus : public BaseCommunication
{Q_OBJECT
public:Q_INVOKABLE  explicit BaseModbus(QObject *parent = nullptr);~BaseModbus();QList<uint16_t> readRegisters(int addr,int count);uint16_t readRegister(int addr);QList<uint16_t> readInputRegisters(int addr,int count);uint16_t readInputRegister(int addr);bool writeRegisters(int addr, int count, QList<uint16_t> inputList);bool writeRegister(int addr, uint16_t inputList);QList<bool> readBits(int addr,int count);bool readBit(int addr);QList<bool> readInputBits(int addr,int count);bool readInputBit(int addr);bool writeBits(int addr, int count, QList<bool> coilStates);bool writeBit(int addr, bool coilState);signals:public slots:// BaseCommunicationZZZ interface
public:virtual bool connectToHost() override;virtual bool isConnected() override;virtual bool disConnect() override;public:template<typename T>static void pointToList(T *source,int size, QList<T> &target){for (int i = 0; i < size; i++){target.append(source[i]); // 逐个添加元素到 QList 中}}private:QMutex  _mutex;   //可以是私有成员变量,也可以是全局变量protected:modbus_t *m_ctx;
};

3.类结构图

在这里插入图片描述

4.项目地址

https://gitee.com/zhang_jie_sc/ucc_communication
使用指南
基于Qt5.9.4+visuaostudio2015 32bit开发
demo共分为modbus、publisher、subscriber、responder、requester几种模式。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

《Kali Linux 软件源更换攻略:优化软件获取与系统更新》

KALI为什么要换源 速度提升 Kali Linux 默认的软件源服务器通常位于国外。在从这些国外源下载软件包、更新系统时&#xff0c;会受到网络带宽、网络延迟等因素的限制。例如&#xff0c;在中国&#xff0c;连接到国外服务器的网络速度可能较慢&#xff0c;尤其是在下载大型软件…

docker安装mysql5.7

1、宿主机创建映射目录 mkdir -p /data/mysql/log mkdir -p /data/mysql/data mkdir -p /data/mysql/conf这里我放在了/data/mysql目录下 2、拉取mysql镜像 docker pull mysql:5.7注意是5.7版本&#xff0c;如果是8版本操作会略有不同&#xff0c;下篇文章介绍安装8版本的操…

RabbitMQ 安装、配置和使用介绍 使用前端js直接调用方式

1. 安装 RabbitMQ 1.1 安装 Erlang RabbitMQ 是基于 Erlang 语言开发的&#xff0c;因此首先需要安装 Erlang。 在 Ubuntu 上安装 Erlang&#xff1a; bash sudo apt-get update sudo apt-get install erlang 在 CentOS 上安装 Erlang&#xff1a; bash sudo yum insta…

PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语

中文版 PyTorch 的 torch.unbind 函数详解与进阶应用 在深度学习中&#xff0c;张量的维度操作是基础又重要的内容。PyTorch 提供了许多方便的工具来完成这些操作&#xff0c;其中之一便是 torch.unbind。与常见的堆叠函数&#xff08;如 torch.stack&#xff09;相辅相成&am…

SQLServer利用QQ邮箱做SMTP服务器发邮件

环境 Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) SQL Server Management Studio 15.0.18384.0 SQL Server 管理对象 (SMO) 16.100.46367.54 Microsoft .NET Framework 4.0.30319.42000 操作系统 Windows Server2019 ———————————————— 前言&#xf…

好用的网站-直接复制的文字图标不需要引入

分享一个前端不需要引入的&#xff0c;可以直接复制的图标网站 直接复制放在代码中 特殊符号大全&#xff0c;可直接复制黏贴 (shijianchuo.net)

修改uniapp下拉刷新圆圈颜色

直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…

Maven插件打包发布远程Docker镜像

dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟&#xff0c;它集成了Maven和Docker&#xff0c;该插件的官方文档地址如下&#xff1a; 地址&#xff1a;https://github.com/spotify/dockerfile-maven 其他说明&#xff1a; dockerfile是用…

〔 MySQL 〕视图

以下是上述文章的目录&#xff1a; 一、视图概述 视图的定义 二、基本使用 创建视图查询视图修改视图影响基表查询验证删除视图 三、视图规则和限制 命名规则数量限制索引和触发器安全性ORDER BY规则与表一起使用 四、实战案例 牛客实战OJ修改基表影响视图查询验证删除…

tomcat被检测到目标URL存在htp host头攻击漏洞

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 Tomcat被检测到目标URL存在http host头攻击漏洞,这个漏洞复现一下就是黑客访问你的网站,之后中修改请求头中的host属…

Vue 子组件修改父组件传过来的值的三种方式

方式1&#xff1a;子组件发送emit&#xff0c;触发父组件修改 父组件 <template><div><son :count"count" updateCount"updateCount" /></div> </template><script> import son from "./son"; export def…

python爬虫项目毕设:天津酒店爬虫数据可视化系统开题报告

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

12.11数据结构-图

无向完全图&#xff1a;在无向图中&#xff0c;如果任意两个顶点之间都存在边&#xff0c;则称该图为无向完全图。 有向完全图&#xff1a;在有向图中&#xff0c;如果任意两个顶点之间都存在方向相反的两条弧&#xff0c;则称该图为有向完全图。 含有n个顶点的无向完全图有…

MySQL 数据库事务实践

引言 在现代应用程序开发中&#xff0c;确保数据库操作的完整性和一致性至关重要。MySQL 提供了强大的事务管理功能&#xff0c;允许开发者以原子性、一致性、隔离性和持久性&#xff08;ACID&#xff09;的方式处理数据。本文将通过详细的解释和实际示例&#xff0c;带你深入…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址&#xff1a;https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64&#xff0c;一直下一步&#xff0c;选择安装的路径位置&#xff0c;一直下一步就安装完成了。打开Anaconda PowerShell Promp…

git使用教程(超详细)-透彻理解git

一.核心基础 核心概念有六个 首先请把与svn有关的一切概念暂时从你的脑海中移除掉&#xff0c;我们要重新认识本文所讲述的所有概念。 1.worktree worktree是一个目录&#xff0c;你在这里对文件进行增加、删除、修改。也就是我们常说的工作区。在git中worktree必须要与一个…

简单的Java小项目

学生选课系统 在控制台输入输出信息&#xff1a; 在eclipse上面的超级简单文件结构&#xff1a; Main.java package experiment_4;import java.util.*; import java.io.*;public class Main {public static List<Course> courseList new ArrayList<>();publi…

java全栈day16--Web后端实战(数据库)

一、数据库介绍 二、Mysql安装&#xff08;自行在网上找&#xff0c;教程简单&#xff09; 安装好了进行Mysql连接 连接语法&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroot -p密码 方法二&#xff1a;winr输入cmd&#xff0c;在命令行中再输入mysql -uroo…

CORDIC 算法实现 _FPGA

注&#xff1a;本文为 “CORDIC 算法” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 Cordic 算法的原理介绍 乐富道 2014-01-28 23:05 Cordic 算法知道正弦和余弦值&#xff0c;求反正切&#xff0c;即角度。 采用用不断的旋转求出对应的正弦余弦值&…

前端(vue组件)

1组件对象 1.1定义组件对象 defineComponent( {} ) 1.2注册组件 1.3使用组件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…