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

背景

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

问题

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

cpp 复制代码
enum State {
        UnconnectedState,
        ConnectingState,
        ConnectedState,
        ClosingState
    };

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

实现

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

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

cpp 复制代码
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);

相关推荐
偷光14 分钟前
浏览器中的隐藏IDE: Elements (元素) 面板
开发语言·前端·ide·php
DKPT18 分钟前
JVM栈溢出和堆溢出哪个先满?
java·开发语言·jvm·笔记·学习
gopyer4 小时前
180课时吃透Go语言游戏后端开发6:Go语言的循环语句
开发语言·游戏·golang·循环语句
ajassi20006 小时前
开源 C++ QT QML 开发(二)工程结构
linux·qt·qml
楼田莉子7 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
摩羯座-185690305947 小时前
爬坑 10 年!京东店铺全量商品接口实战开发:从分页优化、SKU 关联到数据完整性闭环
linux·网络·数据库·windows·爬虫·python
韩立学长7 小时前
【开题答辩实录分享】以《基于python的奶茶店分布数据分析与可视化》为例进行答辩实录分享
开发语言·python·数据分析
天若有情6737 小时前
C++空值初始化利器:empty.h使用指南
开发语言·c++
远远远远子8 小时前
类与对象 --1
开发语言·c++·算法
无敌最俊朗@8 小时前
C/C++ 关键关键字面试指南 (const, static, volatile, explicit)
c语言·开发语言·c++·面试