#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QModbusRtuSerialMaster>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
QModbusRtuSerialMaster *master;
void init_modbus();
};
#endif // MAINWINDOW_H
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSerialPort>
#include<QtDebug>
#include<QVector>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
init_modbus();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::init_modbus(){
master = new QModbusRtuSerialMaster(this);
master->setConnectionParameter(QModbusDevice::SerialPortNameParameter,"COM21");
master->setConnectionParameter(QModbusDevice::SerialParityParameter,QSerialPort::EvenParity);
master->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,QSerialPort::Baud9600);
master->setConnectionParameter(QModbusDevice::SerialDataBitsParameter,QSerialPort::Data8);
master->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,QSerialPort::OneStop);
if(master->connectDevice()){
qDebug()<<"sucesss";
}else{
qDebug()<<"WRONG";
}
}
void MainWindow::on_pushButton_clicked()
{
QModbusDataUnit readunit(QModbusDataUnit::HoldingRegisters,0,10);
if(auto *reply=master->sendReadRequest(readunit,1)){
while(!reply->isFinished()){
QCoreApplication::processEvents();
}
if(reply->error()==QModbusDevice::NoError){
const QModbusDataUnit resultunit = reply->result();
QString result="";
for(uint i=0;i<resultunit.valueCount();++i){
result += QString::number(resultunit.value(i))+" ";
}
ui->label->setText(result);
}else{
qDebug()<<reply->errorString();
}
reply->deleteLater();
}else{
qDebug()<<master->errorString();
}
}
void MainWindow::on_pushButton_2_clicked()
{
QModbusDataUnit writeunit(QModbusDataUnit::HoldingRegisters,0,1);
qint32 value = ui->lineEdit->text().toInt();
writeunit.setValue(0,value);
if(auto *reply=master->sendWriteRequest(writeunit,1)){
while(!reply->isFinished()){
QCoreApplication::processEvents();
}
if(reply->error()==QModbusDevice::NoError){
qDebug()<<"写入成功";
}else{
qDebug()<<"写入失败"+reply->errorString();
}
reply->deleteLater();
}
}
python代码:
# -*- coding: utf-8 -*-
################################################################################
## Form generated from reading UI file 'widget.ui'
##
## Created by: Qt User Interface Compiler version 6.7.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtSerialPort import QSerialPort
from PySide6.QtWidgets import (QApplication, QLabel, QLineEdit, QPushButton,
QSizePolicy, QWidget)
class Ui_Widget(object):
def setupUi(self, Widget):
if not Widget.objectName():
Widget.setObjectName(u"Widget")
Widget.resize(636, 285)
self.lineEdit = QLineEdit(Widget)
self.lineEdit.setObjectName(u"lineEdit")
self.lineEdit.setGeometry(QRect(380, 60, 113, 20))
self.label = QLabel(Widget)
self.label.setObjectName(u"label")
self.label.setGeometry(QRect(60, 30, 191, 61))
self.connect = QPushButton(Widget)
self.connect.setObjectName(u"connect")
self.connect.setGeometry(QRect(110, 170, 75, 23))
self.pushButton_2 = QPushButton(Widget)
self.pushButton_2.setObjectName(u"pushButton_2")
self.pushButton_2.setGeometry(QRect(230, 170, 75, 23))
self.btn_read = QPushButton(Widget)
self.btn_read.setObjectName(u"btn_read")
self.btn_read.setGeometry(QRect(360, 170, 75, 23))
self.btn_write = QPushButton(Widget)
self.btn_write.setObjectName(u"btn_write")
self.btn_write.setGeometry(QRect(460, 170, 75, 23))
self.retranslateUi(Widget)
QMetaObject.connectSlotsByName(Widget)
# setupUi
def retranslateUi(self, Widget):
Widget.setWindowTitle(QCoreApplication.translate("Widget", u"Widget", None))
self.label.setText(QCoreApplication.translate("Widget", u"TextLabel", None))
self.connect.setText(QCoreApplication.translate("Widget", u"connect", None))
self.pushButton_2.setText(QCoreApplication.translate("Widget", u"disconnect", None))
self.btn_read.setText(QCoreApplication.translate("Widget", u"read", None))
self.btn_write.setText(QCoreApplication.translate("Widget", u"write", None))
# retranslateUi
import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtSerialBus import *
class Window(QWidget,Ui_Widget):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.setupUi(self)
self.rtu = QModbusRtuSerialClient(self)
self.rtu.setConnectionParameter(QModbusDevice.ConnectionParameter.SerialPortNameParameter,"COM21")
self.rtu.setConnectionParameter(QModbusDevice.ConnectionParameter.SerialParityParameter,QSerialPort.Parity.EvenParity)
self.rtu.setConnectionParameter(QModbusDevice.ConnectionParameter.SerialBaudRateParameter,QSerialPort.BaudRate.Baud9600)
self.rtu.setConnectionParameter(QModbusDevice.ConnectionParameter.SerialDataBitsParameter,QSerialPort.DataBits.Data8)
self.rtu.setConnectionParameter(QModbusDevice.ConnectionParameter.SerialStopBitsParameter,QSerialPort.StopBits.OneStop)
self.rtu.setTimeout(3)
if self.rtu.connectDevice():
QMessageBox.information(self,"tips","sucess")
else:
QMessageBox.information(self,"tips","wrong")
#slots
self.btn_read.clicked.connect(self.on_read_click)
self.btn_write.clicked.connect(self.on_write_click)
def on_read_click(self):
readuint:QModbusDataUnit = QModbusDataUnit(QModbusDataUnit.RegisterType.HoldingRegisters,0,10)
reply = self.rtu.sendReadRequest(readuint,1)#serveradress 站地址
if reply:
while not reply.isFinished():
QCoreApplication.processEvents()
if reply.error()==QModbusDevice.Error.NoError:
relustunit:QModbusDataUnit = reply.result()
result:str = ""
for i in range(relustunit.valueCount()):
result+=str(relustunit.value(i))+" "
print(result)
else:
print(self.rtu.errorString())
reply.deleteLater()
else:
print(self.rtu.errorString())
def on_write_click(self):
writeUnit :QModbusDataUnit = QModbusDataUnit(QModbusDataUnit.RegisterType.HoldingRegisters,0,3)
#
# value:int = int(self.lineEdit.text())
# writeUnit.setValue(0,value) #写入单个寄存器
writeUnit.setValues([23,4,67]) #写入多个寄存器
reply = self.rtu.sendWriteRequest(writeUnit,1)
if reply:
while not reply.isFinished():
QCoreApplication.processEvents()
if reply.error()==QModbusDevice.Error.NoError:
QMessageBox.information(self, "tips", "写入成功")
else:
QMessageBox.information(self, "tips", f"写入失败:+{reply.errorString()}")
reply.deleteLater()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec())
两种语言都测试成功。总体感觉还是python在开发方面确实非常高效,就一般应用程序而言,它们几乎没啥差别。还是强烈推荐python开发。毕竟人生苦短,我用python.....