一.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();
}