【Qt】modbus之串口模式读操作
生活随笔
收集整理的這篇文章主要介紹了
【Qt】modbus之串口模式读操作
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 開(kāi)發(fā)環(huán)境
- 03. 讀DiscreteInputs程序示例
- 04. 讀Coils程序示例
- 05. 讀InputRegisters程序示例
- 06. 讀HoldingRegisters程序示例
- 07. 綜合示例
- 08. 程序下載
- 09. 附錄
01. 概述
Qt中幾個(gè)常用的串口modbus類(lèi)
QModbusRtuSerialSlave //modbus串口通信方式下的服務(wù)器類(lèi) QModbusRtuSerialMaster //串口通信方式下的客戶(hù)端類(lèi) QModbusServer // QModbusServer類(lèi)接收和處理modbus的請(qǐng)求。 QModbusDataUnit //存儲(chǔ)接收和發(fā)送數(shù)據(jù)的類(lèi),數(shù)據(jù)類(lèi)型為1bit和16bit QModbusReply //客戶(hù)端訪問(wèn)服務(wù)器后得到的回復(fù)(如客戶(hù)端讀服務(wù)器數(shù)據(jù)時(shí)包含數(shù)據(jù)信息)02. 開(kāi)發(fā)環(huán)境
Windows系統(tǒng):Windows10
Qt版本:Qt5.15或者Qt6
Pro配置文件如下
QT += core gui serialbus serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.h# Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target03. 讀DiscreteInputs程序示例
widget.h文件
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>//前向聲明 class QModbusClient; class QModbusReply;class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:QModbusClient *modbusDevice = nullptr;private slots:void onReadReady(); }; #endif // WIDGET_Hwidget.cpp文件
#include "widget.h" #include <QModbusRtuSerialMaster> #include <QModbusDataUnit> #include <QModbusReply> #include <QVariant> #include <QSerialPort> #include <QDebug>//構(gòu)造函數(shù) Widget::Widget(QWidget *parent): QWidget(parent) {//1. 創(chuàng)建QModbusDevice對(duì)象modbusDevice = new QModbusRtuSerialMaster;//2. 如果處于連接狀態(tài),則斷開(kāi)連接if (modbusDevice->state() == QModbusDevice::ConnectedState){//斷開(kāi)連接設(shè)備modbusDevice->disconnectDevice();}//3. 設(shè)置串口相關(guān)參數(shù)//設(shè)置串口信息modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, QVariant("COM3"));//設(shè)置校驗(yàn) 無(wú)校驗(yàn)modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);//設(shè)置波特率modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud19200);//設(shè)置停止位modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);//設(shè)置數(shù)據(jù)位modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);//4. 設(shè)置其他信息//設(shè)置超時(shí)時(shí)間modbusDevice->setTimeout(1000); //1秒//設(shè)置失敗重試次數(shù)modbusDevice->setNumberOfRetries(3);//5. 連接到設(shè)備bool ok = modbusDevice->connectDevice();if (!ok){qDebug() << "連接到串口失敗: " << modbusDevice->errorString();}else{qDebug() << "連接到串口成功";}//6. 發(fā)送讀取數(shù)據(jù)請(qǐng)求//從地址0開(kāi)始讀取10個(gè)保持寄存器的值//QModbusDataUnit data(QModbusDataUnit::HoldingRegisters, 0, 10);//從地址0開(kāi)始讀取10個(gè)離散輸入量的值QModbusDataUnit data(QModbusDataUnit::DiscreteInputs, 0, 10);QModbusReply* reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發(fā)送請(qǐng)求數(shù)據(jù)失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}}//7. 接收響應(yīng)//通過(guò)槽函數(shù)實(shí)現(xiàn)}//析構(gòu)函數(shù) Widget::~Widget() {if (modbusDevice){modbusDevice->disconnectDevice();}delete modbusDevice; }//準(zhǔn)備讀取數(shù)據(jù)的槽函數(shù) void Widget::onReadReady() {auto reply = qobject_cast<QModbusReply*>(sender());if (nullptr == reply){return;}//判斷是否出錯(cuò)if (reply->error() == QModbusDevice::NoError){//讀取響應(yīng)數(shù)據(jù)const QModbusDataUnit responseData = reply->result();qDebug() << responseData.values();}else if (reply->error() == QModbusDevice::ProtocolError){qDebug() << "Read response Protocol error: " << reply->errorString();}else{qDebug() << "Read response Error: " << reply->errorString();}//刪除replyreply->deleteLater(); }執(zhí)行結(jié)果
15:09:19: Starting D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe ... 連接到串口成功 QVector(0, 1, 0, 0, 1, 1, 0, 1, 1, 1) 15:09:22: D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe exited with code 004. 讀Coils程序示例
widget.h文件
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>//前向聲明 class QModbusClient; class QModbusReply;class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:QModbusClient *modbusDevice = nullptr;private slots:void onReadReady(); }; #endif // WIDGET_Hwidget.cpp文件
#include "widget.h" #include <QModbusRtuSerialMaster> #include <QModbusDataUnit> #include <QModbusReply> #include <QVariant> #include <QSerialPort> #include <QDebug>//構(gòu)造函數(shù) Widget::Widget(QWidget *parent): QWidget(parent) {//1. 創(chuàng)建QModbusDevice對(duì)象modbusDevice = new QModbusRtuSerialMaster;//2. 如果處于連接狀態(tài),則斷開(kāi)連接if (modbusDevice->state() == QModbusDevice::ConnectedState){//斷開(kāi)連接設(shè)備modbusDevice->disconnectDevice();}//3. 設(shè)置串口相關(guān)參數(shù)//設(shè)置串口信息modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, QVariant("COM3"));//設(shè)置校驗(yàn) 無(wú)校驗(yàn)modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);//設(shè)置波特率modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud19200);//設(shè)置停止位modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);//設(shè)置數(shù)據(jù)位modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);//4. 設(shè)置其他信息//設(shè)置超時(shí)時(shí)間modbusDevice->setTimeout(1000); //1秒//設(shè)置失敗重試次數(shù)modbusDevice->setNumberOfRetries(3);//5. 連接到設(shè)備bool ok = modbusDevice->connectDevice();if (!ok){qDebug() << "連接到串口失敗: " << modbusDevice->errorString();}else{qDebug() << "連接到串口成功";}//6. 發(fā)送讀取數(shù)據(jù)請(qǐng)求//從地址0開(kāi)始讀取10個(gè)保持寄存器的值//QModbusDataUnit data(QModbusDataUnit::HoldingRegisters, 0, 10);//從地址0開(kāi)始讀取10個(gè)離散輸入量的值//QModbusDataUnit data(QModbusDataUnit::DiscreteInputs, 0, 10);//QModbusDataUnit::Coils 從地址0開(kāi)始讀取10個(gè)線圈值QModbusDataUnit data(QModbusDataUnit::Coils, 0, 10);QModbusReply* reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發(fā)送請(qǐng)求數(shù)據(jù)失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}}//7. 接收響應(yīng)//通過(guò)槽函數(shù)實(shí)現(xiàn)}//析構(gòu)函數(shù) Widget::~Widget() {if (modbusDevice){modbusDevice->disconnectDevice();}delete modbusDevice; }//準(zhǔn)備讀取數(shù)據(jù)的槽函數(shù) void Widget::onReadReady() {auto reply = qobject_cast<QModbusReply*>(sender());if (nullptr == reply){return;}//判斷是否出錯(cuò)if (reply->error() == QModbusDevice::NoError){//讀取響應(yīng)數(shù)據(jù)const QModbusDataUnit responseData = reply->result();qDebug() << responseData.values();}else if (reply->error() == QModbusDevice::ProtocolError){qDebug() << "Read response Protocol error: " << reply->errorString();}else{qDebug() << "Read response Error: " << reply->errorString();}//刪除replyreply->deleteLater(); }執(zhí)行結(jié)果
15:14:35: Starting D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe ... 連接到串口成功 QVector(1, 0, 1, 1, 1, 0, 1, 1, 1, 1) 15:15:12: D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe exited with code 005. 讀InputRegisters程序示例
widget.h文件
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>//前向聲明 class QModbusClient; class QModbusReply;class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:QModbusClient *modbusDevice = nullptr;private slots:void onReadReady(); }; #endif // WIDGET_Hwidget.cpp文件
#include "widget.h" #include <QModbusRtuSerialMaster> #include <QModbusDataUnit> #include <QModbusReply> #include <QVariant> #include <QSerialPort> #include <QDebug>//構(gòu)造函數(shù) Widget::Widget(QWidget *parent): QWidget(parent) {//1. 創(chuàng)建QModbusDevice對(duì)象modbusDevice = new QModbusRtuSerialMaster;//2. 如果處于連接狀態(tài),則斷開(kāi)連接if (modbusDevice->state() == QModbusDevice::ConnectedState){//斷開(kāi)連接設(shè)備modbusDevice->disconnectDevice();}//3. 設(shè)置串口相關(guān)參數(shù)//設(shè)置串口信息modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, QVariant("COM3"));//設(shè)置校驗(yàn) 無(wú)校驗(yàn)modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);//設(shè)置波特率modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud19200);//設(shè)置停止位modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);//設(shè)置數(shù)據(jù)位modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);//4. 設(shè)置其他信息//設(shè)置超時(shí)時(shí)間modbusDevice->setTimeout(1000); //1秒//設(shè)置失敗重試次數(shù)modbusDevice->setNumberOfRetries(3);//5. 連接到設(shè)備bool ok = modbusDevice->connectDevice();if (!ok){qDebug() << "連接到串口失敗: " << modbusDevice->errorString();}else{qDebug() << "連接到串口成功";}//6. 發(fā)送讀取數(shù)據(jù)請(qǐng)求//從地址0開(kāi)始讀取10個(gè)保持寄存器的值//QModbusDataUnit data(QModbusDataUnit::HoldingRegisters, 0, 10);//從地址0開(kāi)始讀取10個(gè)離散輸入量的值//QModbusDataUnit data(QModbusDataUnit::DiscreteInputs, 0, 10);//QModbusDataUnit::Coils 從地址0開(kāi)始讀取10個(gè)線圈值//QModbusDataUnit data(QModbusDataUnit::Coils, 0, 10);//QModbusDataUnit::InputRegisters 從地址0開(kāi)始讀取10個(gè)輸入寄存器的值QModbusDataUnit data(QModbusDataUnit::InputRegisters, 0, 10);QModbusReply* reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發(fā)送請(qǐng)求數(shù)據(jù)失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}}//7. 接收響應(yīng)//通過(guò)槽函數(shù)實(shí)現(xiàn)}//析構(gòu)函數(shù) Widget::~Widget() {if (modbusDevice){modbusDevice->disconnectDevice();}delete modbusDevice; }//準(zhǔn)備讀取數(shù)據(jù)的槽函數(shù) void Widget::onReadReady() {auto reply = qobject_cast<QModbusReply*>(sender());if (nullptr == reply){return;}//判斷是否出錯(cuò)if (reply->error() == QModbusDevice::NoError){//讀取響應(yīng)數(shù)據(jù)const QModbusDataUnit responseData = reply->result();qDebug() << responseData.values();}else if (reply->error() == QModbusDevice::ProtocolError){qDebug() << "Read response Protocol error: " << reply->errorString();}else{qDebug() << "Read response Error: " << reply->errorString();}//刪除replyreply->deleteLater(); }執(zhí)行結(jié)果
15:18:19: Starting D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe ... 連接到串口成功 QVector(10, 11, 12, 13, 14, 15, 16, 17, 18, 11) 15:18:22: D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe exited with code 006. 讀HoldingRegisters程序示例
widget.h文件
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>//前向聲明 class QModbusClient; class QModbusReply;class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:QModbusClient *modbusDevice = nullptr;private slots:void onReadReady(); }; #endif // WIDGET_Hwidget.cpp文件
#include "widget.h" #include <QModbusRtuSerialMaster> #include <QModbusDataUnit> #include <QModbusReply> #include <QVariant> #include <QSerialPort> #include <QDebug>//構(gòu)造函數(shù) Widget::Widget(QWidget *parent): QWidget(parent) {//1. 創(chuàng)建QModbusDevice對(duì)象modbusDevice = new QModbusRtuSerialMaster;//2. 如果處于連接狀態(tài),則斷開(kāi)連接if (modbusDevice->state() == QModbusDevice::ConnectedState){//斷開(kāi)連接設(shè)備modbusDevice->disconnectDevice();}//3. 設(shè)置串口相關(guān)參數(shù)//設(shè)置串口信息modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, QVariant("COM3"));//設(shè)置校驗(yàn) 無(wú)校驗(yàn)modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);//設(shè)置波特率modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud19200);//設(shè)置停止位modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);//設(shè)置數(shù)據(jù)位modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);//4. 設(shè)置其他信息//設(shè)置超時(shí)時(shí)間modbusDevice->setTimeout(1000); //1秒//設(shè)置失敗重試次數(shù)modbusDevice->setNumberOfRetries(3);//5. 連接到設(shè)備bool ok = modbusDevice->connectDevice();if (!ok){qDebug() << "連接到串口失敗: " << modbusDevice->errorString();}else{qDebug() << "連接到串口成功";}//6. 發(fā)送讀取數(shù)據(jù)請(qǐng)求//從地址0開(kāi)始讀取10個(gè)保持寄存器的值QModbusDataUnit data(QModbusDataUnit::HoldingRegisters, 0, 10);QModbusReply* reply = modbusDevice->sendReadRequest(data, 0x1);if (nullptr == reply){qDebug() << "發(fā)送請(qǐng)求數(shù)據(jù)失敗: " << modbusDevice->errorString();}else{if (!reply->isFinished()){connect(reply, &QModbusReply::finished, this, &Widget::onReadReady);}else{//broadcast replies return immediatelydelete reply;}}//7. 接收響應(yīng)//通過(guò)槽函數(shù)實(shí)現(xiàn)}//析構(gòu)函數(shù) Widget::~Widget() {if (modbusDevice){modbusDevice->disconnectDevice();}delete modbusDevice; }//準(zhǔn)備讀取數(shù)據(jù)的槽函數(shù) void Widget::onReadReady() {auto reply = qobject_cast<QModbusReply*>(sender());if (nullptr == reply){return;}//判斷是否出錯(cuò)if (reply->error() == QModbusDevice::NoError){//讀取響應(yīng)數(shù)據(jù)const QModbusDataUnit responseData = reply->result();qDebug() << responseData.values();}else if (reply->error() == QModbusDevice::ProtocolError){qDebug() << "Read response Protocol error: " << reply->errorString();}else{qDebug() << "Read response Error: " << reply->errorString();}//刪除replyreply->deleteLater(); }執(zhí)行結(jié)果
14:33:54: Starting D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe ... 連接到串口成功 QVector(10, 11, 12, 13, 14, 15, 16, 17, 18, 19) 14:33:57: D:\ProgramData\Qt\build-Test-Desktop_Qt_5_15_2_MinGW_32_bit-Debug\debug\Test.exe exited with code 007. 綜合示例
程序界面
settingdialog.h文件
#ifndef SETTINGDIALOG_H #define SETTINGDIALOG_H#include <QDialog> #include <QtSerialPort>namespace Ui { class SettingDialog; }//串口設(shè)置相關(guān)類(lèi) class SettingDialog : public QDialog {Q_OBJECTpublic:struct Settings{//串口名QString serialName = "COM3";//校驗(yàn)位int parity = QSerialPort::NoParity;//波特率int baud = QSerialPort::Baud19200;//數(shù)據(jù)位int dataBits = QSerialPort::Data8;//停止位int stopBits = QSerialPort::OneStop;//響應(yīng)時(shí)間int responseTime = 1000;//重試次數(shù)int numberOfRetries = 3;};explicit SettingDialog(QWidget *parent = nullptr);~SettingDialog();//返回參數(shù)設(shè)置信息Settings settings() const;private slots:void on_btnApply_clicked();private:Ui::SettingDialog *ui;Settings m_settings; };#endif // SETTINGDIALOG_Hsettingdialog.cpp文件
#include "settingdialog.h" #include "ui_settingdialog.h"//構(gòu)造函數(shù) SettingDialog::SettingDialog(QWidget *parent) :QDialog(parent),ui(new Ui::SettingDialog) {ui->setupUi(this);//設(shè)置默認(rèn)參數(shù)信息ui->serialNameLineEdit->setText(tr("COM3"));ui->parityComboBox->setCurrentIndex(0);ui->baudComboBox->setCurrentText(QString::number(m_settings.baud));ui->dataBitComboBox->setCurrentText(QString::number(m_settings.dataBits));ui->stopBitComboBox->setCurrentText(QString::number(m_settings.stopBits));ui->spinBoxTimeOut->setValue(m_settings.responseTime);ui->spinBoxRetry->setValue(m_settings.numberOfRetries);}//析構(gòu)函數(shù) SettingDialog::~SettingDialog() {delete ui; }//返回參數(shù)信息 SettingDialog::Settings SettingDialog::settings() const {return m_settings; }//引用按鈕槽函數(shù) void SettingDialog::on_btnApply_clicked() {m_settings.serialName = ui->serialNameLineEdit->text();m_settings.parity = ui->parityComboBox->currentText().toInt();m_settings.baud = ui->baudComboBox->currentText().toInt();m_settings.dataBits = ui->dataBitComboBox->currentText().toInt();m_settings.stopBits = ui->stopBitComboBox->currentText().toInt();m_settings.responseTime = ui->spinBoxTimeOut->value();m_settings.numberOfRetries = ui->spinBoxRetry->value();//隱藏參數(shù)設(shè)置對(duì)話框hide(); }mainwindow.h文件
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QModbusDataUnit>QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow; }class SettingDialog; class QModbusClient; class QModbusReply;QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//信號(hào)與槽進(jìn)行關(guān)聯(lián)void initActions();//讀請(qǐng)求數(shù)據(jù)包封裝QModbusDataUnit readRequest() const;private slots:void onConnectButtonClicked();void onConnectTypeChanged(int);void onModbusStateChanged(int state);void onReadButtonClicked();void onReadReady();private:Ui::MainWindow *ui = nullptr;SettingDialog *m_settingDialog = nullptr;QModbusClient *modbusDevice = nullptr;QModbusReply *reply = nullptr;}; #endif // MAINWINDOW_Hmainwindow.cpp文件
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QModbusDataUnit>QT_BEGIN_NAMESPACEnamespace Ui {class MainWindow; }class SettingDialog; class QModbusClient; class QModbusReply;QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();//信號(hào)與槽進(jìn)行關(guān)聯(lián)void initActions();//讀請(qǐng)求數(shù)據(jù)包封裝QModbusDataUnit readRequest() const;private slots:void onConnectButtonClicked();void onConnectTypeChanged(int);void onModbusStateChanged(int state);void onReadButtonClicked();void onReadReady();private:Ui::MainWindow *ui = nullptr;SettingDialog *m_settingDialog = nullptr;QModbusClient *modbusDevice = nullptr;QModbusReply *reply = nullptr;}; #endif // MAINWINDOW_H08. 程序下載
8.1 Qt RTU Master示例一.rar
8.2 RTUMasterTest(二).rar
09. 附錄
9.1 Qt教程匯總
網(wǎng)址:https://dengjin.blog.csdn.net/article/details/115174639
總結(jié)
以上是生活随笔為你收集整理的【Qt】modbus之串口模式读操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Tools】Tools博客汇总
- 下一篇: 【Qt】modbus之串口模式写操作