Qt与485设备同步通讯(Qt向设备发送指令)

一.485设备准备与调试

1.准备485通讯设备 比如一台PLC或者其他类型的传感器、控制器等设备。

2.连接485通讯设备 将485通讯设备与计算机进行连接,通常可以通过串口连接或者USB转485模块连接。

3.安装Qt串口通讯库 在Qt中实现串口通讯需要使用串口通讯库,可以选择Qt自带的QtSerialPort模块或者第三方的串口通讯库。

二.Qt程序设计与测试

* 在Qt中新建一个工程,编写程序实现与485通讯设备的数据交互。首先需要打开串口并设置串口参数,然后可以通过串口发送数据给485设备或者接收485设备发送的数据。

.pro文件

# project3.pro
QT += core network widgets
CONFIG += c++11

TARGET = project3
TEMPLATE = app

SOURCES += \
        main.cpp \
        mainwindow.cpp \
        tcpmanager.cpp

HEADERS += \
        mainwindow.h \
        tcpmanager.h

FORMS += \
    form.ui

mainwindow.h文件

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "tcpmanager.h"

class QPushButton;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onSendButtonClicked();
    void onTcpDataReceived(const QByteArray &data);

private:
    TcpManager *tcpManager;
    QPushButton *sendButton;
};

#endif // MAINWINDOW_H

tcpmanager.h(定义的一个新类)文件

// tcpmanager.h
#ifndef TCPMANAGER_H
#define TCPMANAGER_H

#include <QObject>
#include <QTcpSocket>

class TcpManager : public QObject
{
    Q_OBJECT

public:
    explicit TcpManager(QObject *parent = nullptr);
    void connectToGateway(const QString &host, quint16 port);
    void sendHexData(const QString &hexString);

signals:
    void dataReceived(const QByteArray &data);

private slots:
    void onConnected();
    void onDisconnected();
    void onReadyRead();
    void onError(QAbstractSocket::SocketError socketError);

private:
    QTcpSocket *tcpSocket;
};

#endif // TCPMANAGER_H

main.cpp文件

// main.cpp
#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.show(); // 现在 MainWindow 有 show 方法了

    return app.exec();
}

mainwindow.cpp文件

// mainwindow.cpp
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), tcpManager(new TcpManager(this))
{
    // 初始化 TcpManager 并尝试连接到网关
    tcpManager->connectToGateway(" 192.168.1.203", 502); // 替换为你的网关IP和端口
    // 连接接收信号到槽函数
    connect(tcpManager, &TcpManager::dataReceived, this, &MainWindow::onTcpDataReceived);

    // 创建按钮并连接点击信号到槽函数
    sendButton = new QPushButton("Send Test Command", this);
    connect(sendButton, &QPushButton::clicked, this, &MainWindow::onSendButtonClicked);

    // 设置按钮为中心控件
    setCentralWidget(sendButton);

    // 发送测试指令作为演示
    onSendButtonClicked();
}

MainWindow::~MainWindow()
{
    // 删除 TCP 管理器实例
    delete tcpManager;
}

// 当按钮被点击时,发送测试指令
void MainWindow::onSendButtonClicked()
{
    QString hexCommand = "010300000002C40B"; // 示例指令,替换成需要的指令
    tcpManager->sendHexData(hexCommand); // 通过 tcpManager 发送指令
}

// 用于接收数据的槽函数
void MainWindow::onTcpDataReceived(const QByteArray &data)
{
    qDebug() << "Received data:" << data.toHex(); // 将接收到的数据打印到调试控制台
}

tcpmanager.cpp文件 

// tcpmanager.cpp
#include "tcpmanager.h"
#include <QDebug>
#include <QTcpSocket>


TcpManager::TcpManager(QObject *parent) : QObject(parent)
{
    tcpSocket = new QTcpSocket(this);
    connect(tcpSocket, &QTcpSocket::connected, this, &TcpManager::onConnected);
    connect(tcpSocket, &QTcpSocket::disconnected, this, &TcpManager::onDisconnected);
    connect(tcpSocket, &QTcpSocket::readyRead, this, &TcpManager::onReadyRead);
    // Changed line below
    connect(tcpSocket, &QTcpSocket::errorOccurred, this, &TcpManager::onError);
}


void TcpManager::connectToGateway(const QString &host, quint16 port)
{
    tcpSocket->connectToHost(host, port);
}

void TcpManager::sendHexData(const QString &hexString)
{
    if(tcpSocket->state() == QAbstractSocket::ConnectedState)
    {
        QByteArray data = QByteArray::fromHex(hexString.toLocal8Bit());
        tcpSocket->write(data);
    }
}

void TcpManager::onConnected()
{
    qDebug() << "Connected to the gateway.";
}

void TcpManager::onDisconnected()
{
    qDebug() << "Disconnected from the gateway.";
}

void TcpManager::onReadyRead()
{
    QByteArray data = tcpSocket->readAll();

    // Emit the signal to notify other parts of the program
    emit dataReceived(data);
}

void TcpManager::onError(QAbstractSocket::SocketError socketError)
{
    Q_UNUSED(socketError)
    qWarning() << tcpSocket->errorString();
}

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值