当前位置: 首页 > news >正文

【QT】ModbusTCP读写寄存器类封装

背景

在编写ModbusTCP时候,连接、寄存器读写属于通用的功能,为了便于后续直接复用,选择封装到一个类。本博文在封装展示该类过程中,会提及到编写该类过程中,出现的连接未成功的问题,以及该问题的解决方式。

问题

首先,需要明确设备连接状态有4类:

enum State {UnconnectedState,ConnectingState,ConnectedState,ClosingState};

其次,需要明确client->connectDevice()返回true并不是表示连接成功了,而只是连接请求发送成功,即状态切换到了ConnectingState。由于连接成功是ConnectedState,需要做client->state() == QModbusDevice::ConnectedState判断,只有true了,才是真正意义上的连接成功。

实现

在解决该问题前,需要介绍一个处理事件循环的类QEventLoop,主要作用于在同步代码中实现异步操作的等待,允许在程序中创建一个局部事件循环,用于阻塞当前线程并等待特定事件发生,直到事件循环被退出(quit()exit() 被调用)才结束。它的生命周期:事件循环在exec()调用后启动,在 quit() 后停止,通常配合信号槽机制使用

针对以上提及的问题,加入超时机制,等待连接完成:

bool modbusClient::connect(QString &msg)
{if (!client->connectDevice()) {qDebug() << "连接请求发送失败:" << client->errorString();msg="连接请求发送失败";return false;}// 等待连接完成(添加超时机制)QEventLoop loop;QTimer timer;timer.setSingleShot(true);//单次触发模式。定时器超时后会自动停止,不会重复触发timer.setInterval(2500);// 监听连接状态变化QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);QObject::connect(client, &QModbusClient::stateChanged, [&](QModbusDevice::State state) {// qDebug() << "连接状态变化:" << state;if (state == QModbusDevice::ConnectedState) {loop.quit();  // 连接成功,退出事件循环}});timer.start();loop.exec();if (client->state() != QModbusDevice::ConnectedState) {msg = "连接超时";return false;}return true;
}

解决了以上的问题后,就可以进行modbusClient类封装了,已上传资源,注意使用时候要pro中引入QT += serialbus。调用方式,可以采用值调用方式modbusClient md(it.key(),it.value());md.work1(msg);,也可以采用指针的调用方式modbusClient *md1 =new modbusClient(it.key(),it.value()); md1->work1(msg);

相关文章:

  • List介绍
  • 绿色云计算:数字化转型与可持续发展的完美融合
  • 【Linux】第二十四章 管理网络安全
  • Django快速入门篇
  • 现代健康养生:解锁生活中的科学防护密码
  • C#:多线程Task使用
  • upload-labs通关笔记-第14关 文件上传之文件头绕过(图片马)
  • avalonia android连接模拟器时报错adb cannot run as root in production builds,没有权限
  • 闲时处理技术---CAD C#二次开发
  • 下载Ubuntu 64 位
  • 游戏引擎学习第296天:层的雾效和透明度
  • Secarmy Village: Grayhat Conference靶场
  • PowerBI 矩阵实现动态行内容(如前后销售数据)统计数据,以及过滤同时为0的数据
  • 系统集成项目管理工程师学习笔记之启动过程组
  • OpenHarmony开源鸿蒙兼容性测试常见问题解答分享
  • mac上将 Excel 文件的扩展名从 .xls 改为 .xlsx 后,打开时报错:“文件格式或文件扩展名无效”。
  • 攻防世界 Web题--easytornado
  • 【css知识】flex-grow: 1
  • 数据分析_主播考核指标体系搭建
  • 使用注解动态映射:根据实体List列表动态生成Excel文件
  • 联合国妇女署:超过2.8万名妇女和女童在加沙战火中丧生
  • 为小龙虾洗清这些“黑锅”,这份科学吃虾指南请收好
  • 上海婚登人聂晶:见证爱情故事开启,也向长久婚姻致敬
  • 全国首例闭环脊髓神经接口手术在浙江完成,截瘫患者实现自主行走
  • 携程:今年第一季度营业收入约138亿元,入境旅游预订同比增长超100%
  • 李在明遭遇暗杀威胁,韩国警方锁定两名嫌疑人