当前位置: 首页 > 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…...

显卡驱动深度清理指南:用DDU解决驱动残留难题

显卡驱动深度清理指南&#xff1a;用DDU解决驱动残留难题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstaller 你是…...

自建轻量CI_CD:GitHub Actions + Docker + 自动版本号 + 自动回滚 实战教程

自建轻量CI/CD&#xff1a;GitHub Actions Docker 自动版本号 自动回滚 实战教程 &#x1f3f7;️ 标签&#xff1a;CI/CD、GitHub Actions、Docker、自动化部署、自动版本号、自动回滚、DevOps &#x1f4cc; 阅读指南&#xff1a;本文手把手带你搭建一套轻量、免费、稳定的…...

永磁同步电机这玩意儿现在工业上用得是真多,今天咱们来点硬核的,手搓个IPMSM的数学模型。先别急着关页面,代码实现和调试坑点都给你备好了

IPMSM数学模型&#xff0c;模拟电机对不同输入的响应&#xff0c;包含速度环和电流环&#xff0c;输出电流转速和转矩。先甩几个核心方程镇楼。d-q轴电压方程&#xff1a; def voltage_equation(t, state, Vd, Vq):id, iq, w_r, theta stateVd ... # 这里放你的控制算法输出V…...

向量化计算失效的7大隐性陷阱,深度解析HotSpot向量编译器决策逻辑

第一章&#xff1a;向量化计算失效的7大隐性陷阱&#xff0c;深度解析HotSpot向量编译器决策逻辑HotSpot JVM 的向量化编译&#xff08;Vector API 编译支持与循环自动向量化&#xff09;并非在所有场景下都能生效。其背后由C2编译器的向量化决策引擎驱动&#xff0c;该引擎基于…...

像素时装锻造坊:零基础5分钟快速部署,开启你的AI像素时装设计之旅

像素时装锻造坊&#xff1a;零基础5分钟快速部署&#xff0c;开启你的AI像素时装设计之旅 1. 为什么选择像素时装锻造坊 想象一下&#xff0c;你正在设计一款复古风格的像素游戏&#xff0c;需要为角色制作各种皮革时装。传统方法要么需要专业的美术功底&#xff0c;要么得花…...

揭秘Figma-MCP与ClaudeCode:驱动像素级UI还原的协议与智能引擎

1. Figma-MCP协议&#xff1a;设计到代码的桥梁 Figma-MCP协议是连接设计工具与开发环境的关键纽带。我第一次接触这个协议时&#xff0c;就被它解决设计还原痛点的能力震撼了。传统开发流程中&#xff0c;设计师在Figma里精心打磨的界面&#xff0c;到了开发阶段往往要经历痛苦…...

告别笨重电感!用这颗TI的TPS60503电荷泵芯片,给你的便携设备做个高效小体积电源

无电感电源革命&#xff1a;TPS60503电荷泵在便携设备中的极致能效设计 当智能手表在清晨用震动唤醒你&#xff0c;当无线耳机在通勤路上播放音乐&#xff0c;这些贴身电子设备背后都藏着一个关键矛盾——如何在指甲盖大小的空间里实现高效供电&#xff1f;传统电感式DCDC转换器…...

别再手动推导了!用Sophus库5分钟搞定机器人SLAM中的位姿插值与扰动更新

别再手动推导了&#xff01;用Sophus库5分钟搞定机器人SLAM中的位姿插值与扰动更新 在机器人SLAM开发中&#xff0c;你是否曾为手动推导旋转矩阵的插值公式而抓狂&#xff1f;是否在实现位姿扰动更新时被四元数微分弄得晕头转向&#xff1f;今天&#xff0c;我们将用Sophus库彻…...

从‘它又挂了’到‘稳如老狗’:我是如何用Prometheus+Grafana给自家小破站做监控的

从“它又挂了”到“稳如老狗”&#xff1a;我是如何用PrometheusGrafana给自家小破站做监控的 凌晨三点&#xff0c;手机突然响起钉钉告警——这已经是本周第三次被“502 Bad Gateway”的提示音吵醒。揉着惺忪睡眼重启Nginx时&#xff0c;我突然意识到&#xff1a;这个用业余时…...

VIT模型IP核需要修改的地方

导入路径 "D:\VIT\HG-PIPE\instances\proj_ATTN0\work"选择“open project”整合多个 HLS IP 时 遇到“撞名”此时会报错&#xff1a;Top function not found: there is no function named top INFO: [HLS 200-1510] Running: set_directive_top -name top top...