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

用C++QT实现一个modbus rtu通讯程序框架

下面是一个简单的Modbus RTU通讯程序框架的示例,使用C++和QT来实现:

#include <QCoreApplication>
#include <QSerialPort>
#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建串口对象QSerialPort serial;serial.setPortName("COM1"); // 设置串口名称serial.setBaudRate(QSerialPort::Baud9600); // 设置波特率serial.setDataBits(QSerialPort::Data8); // 设置数据位serial.setParity(QSerialPort::NoParity); // 设置校验位serial.setStopBits(QSerialPort::OneStop); // 设置停止位// 打开串口if (!serial.open(QIODevice::ReadWrite)){qDebug() << "Failed to open serial port!";return 1;}// 创建Modbus RTU主站对象QModbusRtuSerialMaster modbusMaster;modbusMaster.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1"); // 设置串口名称modbusMaster.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600); // 设置波特率modbusMaster.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); // 设置数据位modbusMaster.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity); // 设置校验位modbusMaster.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); // 设置停止位// 设置Modbus设备地址modbusMaster.setServerAddress(1);// 连接Modbus RTU设备if (!modbusMaster.connectDevice()){qDebug() << "Failed to connect to Modbus device!";return 1;}// 创建Modbus数据单元QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10); // 读取保持寄存器0~9的数据// 读取Modbus数据if (auto *reply = modbusMaster.sendReadRequest(readUnit, 1)){// 等待读取完成if (!reply->isFinished()){QEventLoop loop;QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);loop.exec();}// 检查读取结果if (reply->error() == QModbusDevice::NoError){// 处理读取到的数据const auto values = reply->result().values();for (int i = 0; i < values.size(); ++i){qDebug() << "Register" << i << "=" << values.at(i);}}else{qDebug() << "Read error:" << reply->errorString();}// 释放Modbus回复对象reply->deleteLater();}else{qDebug() << "Failed to send Modbus read request!";}// 关闭Modbus连接modbusMaster.disconnectDevice();// 关闭串口serial.close();return a.exec();
}

具体的数据处理将根据需求进行扩展和实现,如写入数据和处理异常等。另外,需要根据实际情况设置正确的串口参数和设备地址,并确保与Modbus设备的正确连接。在编译和运行程序之前,还需要在项目的.pro文件中添加QT+=serialport以启用QtSerialPort模块。

下面是一个写入Modbus寄存器的示例:

// 创建Modbus数据单元
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 1); // 写入保持寄存器0// 设置写入数据
QVector<quint16> data;
data.append(123); // 写入的数据
writeUnit.setValues(data);// 写入Modbus数据
if (auto *reply = modbusMaster.sendWriteRequest(writeUnit, 1))
{// 等待写入完成if (!reply->isFinished()){QEventLoop loop;QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);loop.exec();}// 检查写入结果if (reply->error() == QModbusDevice::NoError){qDebug() << "Write request completed successfully!";}else{qDebug() << "Write error:" << reply->errorString();}// 释放Modbus回复对象reply->deleteLater();
}
else
{qDebug() << "Failed to send Modbus write request!";
}

相关文章:

用C++QT实现一个modbus rtu通讯程序框架

下面是一个简单的Modbus RTU通讯程序框架的示例&#xff0c;使用C和QT来实现&#xff1a; #include <QCoreApplication> #include <QSerialPort> #include <QModbusDataUnit> #include <QModbusRtuSerialMaster>int main(int argc, char *argv[]) {QC…...

Python如何设置下载第三方软件包的国内镜像站服务器的地址

使用pip下载第三方python软件包时&#xff0c;如果下载的速度太慢&#xff0c;说明是从国外的服务器上下载的。需要进行一个设置&#xff0c;让pip从国内的镜像站服务器下载。 1. 新建一个纯文本文件&#xff0c;Windows下名字叫做pip.ini&#xff1b;Linux下名字叫做pip.cnf…...

ChatGLM3-6B详细安装过程记录(Linux)

先附上GitHub官方地址: https://github.com/THUDM/ChatGLM3https://github.com/THUDM/ChatGLM3 目录 一、预览 1. 基于 Gradio 的网页版 demo...

python的类

python中的类用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 一、object是python的默认类&#xff0c;有很多方法&#xff0c;python3默认所有的类都继承object&#xff0c;定义类的时候类名后面加不加括号&#x…...

前端 用HTML,CSS, JS 写一个简易的音乐播放器

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Music Player</title><style>/* 样式可自行修改 */.container {width: 600px;margin: 0 auto;}h2 {text-align: center;}.controls {displ…...

自定义QChartView实现鼠标放在图表时,显示鼠标位置坐标值(x,y)

前言&#xff1a;因为需要一次性从文件中加载大量数据到图表中显示&#xff0c;所以打算使用qchartviewqscrollarea&#xff0c;当横坐标数据超出默认设定的显示范围之后&#xff0c;重新设置chartview的宽度和scrollarea内容区域(scrollAreaWidgetContents)的宽度&#xff0c;…...

antv/g6 交互与事件及自定义Behavior

监听和绑定事件 在 G6 中&#xff0c;提供了直接的单机事件、还有监听时机的方法。可以监听画布、节点、边、以及各函数被调用的时机等&#xff1a; 1. 绑定事件 要绑定事件&#xff0c;首先需要获得图表实例&#xff08;Graph 实例&#xff09;&#xff0c;然后使用 on 方法…...

MongoDB根据时间范围查询

MongoDB 查询语句示例 1. 根据时间范围查询 db.getCollection(orders).find({"enabled":true,"$or": [{"endTime": {"$gt":ISODate("2023-10-18T14:45:17.69870008:00")}}, {"endTime": null}], "startTim…...

大数据Doris(十五):Doris表的字段类型

文章目录 Doris表的字段类型 一、TINYINT数据类型 二、SMALLINT数据类型 三、INT数据类型...

文本批量处理,一键转换HTML文件编码,释放您的繁琐工作!

亲爱的用户&#xff0c;您是否曾经为需要手动转换HTML文件编码而耗费大量时间和精力而感到困扰&#xff1f;现在&#xff0c;我们为您提供了一款强大的文本批量处理工具&#xff01;让您一键将HTML文件编码进行转换&#xff0c;轻松释放您的繁琐工作&#xff01; 首先&#xf…...

硬件工程师到底可以从哪些方面提升自己?

大家好,这里是大话硬件。 最近在大话硬件群里,聊得比较多的就是讨论怎么提升自己的能力,怎么拿到更高的工资。我想,这可能并不是只在大话硬件群才有的话题,其实在每一位工作的人心里应该都在想的两个问题。 因此,这篇文章简单分享一下,作为一名硬件工程师,可以在做哪…...

论文辅助笔记:t2vec models.py

1 EncoderDecoder 1.1 _init_ class EncoderDecoder(nn.Module):def __init__(self, vocab_size, embedding_size,hidden_size, num_layers, dropout, bidirectional):super(EncoderDecoder, self).__init__()self.vocab_size vocab_size #词汇表大小self.embedding_size e…...

R语言如何写一个爬虫代码模版

R语言爬虫是利用R语言中的网络爬虫包&#xff0c;如XML、RCurl、rvest等&#xff0c;批量自动将网页的内容抓取下来。在进行R语言爬虫之前&#xff0c;需要了解HTML、XML、JSON等网页语言&#xff0c;因为正是通过这些语言我们才能在网页中提取数据。 在爬虫过程中&#xff0c;…...

鸿运主动安全云平台任意文件下载漏洞复习

简介 深圳市强鸿电子有限公司鸿运主动安全监控云平台网页存在任意文件下载漏洞&#xff0c;攻击者可通过此漏洞下载网站配置文件等获得登录账号密码 漏洞复现 FOFA语法&#xff1a;body"./open/webApi.html" 获取网站数据库配置文件 POC&#xff1a;/808gps/Mobile…...

CMake基础【学习笔记(八)】

声明此博客为转载 CMake基础 文章目录 CMake基础一、准备知识1.1 C的编译过程1.2 静态链接库和动态链接库1.3 为什么需要CMake1.3.1 g 命令行编译1.3.2 CMake简介 二、CMake基础知识2.1 安装2.2 第一个CMake例子2.3 语法基础2.3.1 指定版本2.3.2 设置项目2.3.3 添加可执行文件…...

异常的学习

异常分为编译时期异常与运行时期异常 编译时期异常运行前必须处理&#xff0c;否则代码报错 除了RuntimeException和他的子类&#xff0c;其他都是编译时异常 运行时期异常运行时报错&#xff0c;一般是由参数传递错误导致的报错 异常的作用&#xff1a; 1.异常使用来查询b…...

【洛谷 P1101】单词方阵 题解(深度优先搜索)

单词方阵 题目描述 给一 n n n \times n nn 的字母方阵&#xff0c;内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 8 8 个方向的任一方向&#xff0c;同一单词摆放时不再改变方向&#xff0c;单词与单词之间可以交叉&#xff0c;因此…...

教师减负神器

在传统的成绩管理模式中&#xff0c;教师需要手动输入、整理、分析成绩数据&#xff0c;工作量大且繁琐。这不仅耗费了教师大量的时间和精力&#xff0c;还容易出现错误。为了解决这个问题&#xff0c;我们可以通过各种代码和Excel来实现学生自助查询成绩的功能。 一、建立成绩…...

Web 开发之前的一些话

我主要是对单页面进行开发&#xff0c;因而VUEFlask的搭配足以满足我的需求&#xff1b; VUE Vue.js - 渐进式 JavaScript 框架 | Vue.js Element-UI Element - The worlds most popular Vue UI framework FLASK 欢迎来到 Flask 的世界 — Flask中文文档(2.3.x)...

git快速入门!!! git的常用命令!!!

git快速入门 git的常用命令1. 初始化一个新的 Git 仓库2. 添加文件到暂存区3. 提交更改4. 查看当前分支的状态5. 创建并切换到新的分支6. 切换回之前的分支7. 合并分支8. 拉取远程仓库的更新9. 推送本地仓库的更新 git remote -v是什么git fetchclone命令详解push指定的分支git…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...