用qt写一段代码实现一个上位机控制两个下位机的功能,其中IP地址不同但端口号都是10001
时间: 2024-02-11 14:05:58 浏览: 78
用QT制作一个TCPServer的上位机与TCPClient的下位机通信
好的,以下是一份简单的示例代码,实现一个基于Qt的上位机控制两个下位机的功能,其中IP地址不同但端口号都是10001:
```cpp
#include <QtNetwork>
// 控制下位机的命令
const QByteArray CMD_CONTROL_1 = "control_1";
const QByteArray CMD_CONTROL_2 = "control_2";
class UpperMachine : public QObject
{
Q_OBJECT
public:
UpperMachine(QObject *parent = nullptr) : QObject(parent)
{
// 初始化两个下位机的地址和端口号
m_addr1.setAddress("192.168.0.101");
m_addr2.setAddress("192.168.0.102");
m_port = 10001;
// 初始化套接字
m_socket1 = new QUdpSocket(this);
m_socket2 = new QUdpSocket(this);
// 绑定端口号
m_socket1->bind(QHostAddress::Any, m_port);
m_socket2->bind(QHostAddress::Any, m_port);
// 接收到数据时触发的槽函数
connect(m_socket1, &QUdpSocket::readyRead, this, &UpperMachine::onReadyRead);
connect(m_socket2, &QUdpSocket::readyRead, this, &UpperMachine::onReadyRead);
}
// 发送控制命令到下位机1
void control1()
{
m_socket1->writeDatagram(CMD_CONTROL_1, m_addr1, m_port);
}
// 发送控制命令到下位机2
void control2()
{
m_socket2->writeDatagram(CMD_CONTROL_2, m_addr2, m_port);
}
private slots:
// 接收到数据时的槽函数
void onReadyRead()
{
// 获取接收到的数据
QUdpSocket *socket = qobject_cast<QUdpSocket *>(sender());
QByteArray data;
data.resize(socket->pendingDatagramSize());
QHostAddress senderAddr;
quint16 senderPort;
socket->readDatagram(data.data(), data.size(), &senderAddr, &senderPort);
// 处理接收到的数据
if (senderAddr == m_addr1) {
// 接收到下位机1的数据
qDebug() << "Received data from slave 1: " << data;
} else if (senderAddr == m_addr2) {
// 接收到下位机2的数据
qDebug() << "Received data from slave 2: " << data;
}
}
private:
QHostAddress m_addr1; // 下位机1的地址
QHostAddress m_addr2; // 下位机2的地址
quint16 m_port; // 端口号
QUdpSocket *m_socket1; // 套接字1
QUdpSocket *m_socket2; // 套接字2
};
```
使用方法如下:
```cpp
UpperMachine *upperMachine = new UpperMachine(this);
// 控制下位机1
upperMachine->control1();
// 控制下位机2
upperMachine->control2();
```
注意,这只是一个简单的示例代码,实际应用中需要考虑更多的因素,例如数据格式、错误处理等。
阅读全文