前言
使用Qt开发上位机实现与ABB机器人的TCP/IP通信,并且可以在上位机实现读取机器人的位置信息和给机器人发送指令。
本文提供实现Socket通信的核心代码,对于后续的优化和增加各种功能,就不作展示了。
对于ABB机器人服务端和C语言实现的客户端的详细内容可以参考
ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)
ABB机器人与PC进行Windows下的Socket通信的C代码实现(客户端)
QtClientSocket.pro文件
添加network
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAbstractSocket>
#include <QDebug>
class QTcpSocket;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
void Sleep(int msec);
void CloseSocket();
void ConnectSocket();
void SendMessage();
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QTcpSocket *clientSocket;
private slots:
void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "test1.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
// w.ConnectSocket();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QTime>
#include "mainwindow.h"
#include "test1.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ConnectSocket();
connect(clientSocket, &QTcpSocket::readyRead, [=]()
{
//获取服务端发送的内容
QByteArray array = clientSocket->readAll();
qDebug()<<array.toInt()<<endl;
}
);
for(int i=1;i<13;i++)
{
SendMessage();
Sleep(5000);//延时5秒发送一次指令
};
// CloseSocket();
}
void MainWindow::ConnectSocket()
{
QString ip = "127.0.0.1";
int port = 55000;
clientSocket = new QTcpSocket(this);
clientSocket->connectToHost(ip, port);//连接服务端
if(!clientSocket->waitForConnected(3600000))//连接服务器等待
{
qDebug()<<"连接服务端失败!"<<endl;
return;
}
else
{
qDebug()<<"连接服务端成功!"<<endl;
}
}
void MainWindow::CloseSocket()
{
//主动和对方断开连接
clientSocket->disconnectFromHost();
clientSocket->close();//这里释放连接,前面connect的时候会建立连接
}
void MainWindow::SendMessage()
{
//发送数据
clientSocket->write("move");//发送字符串给服务端
clientSocket->flush();//刷新缓存区
}
void MainWindow::Sleep(int msec)//延时函数
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
SendMessage();//点下按钮,发送信息给服务端
}
实现效果
for循环实现自动发送指令:
手动发送指令:
总结
与C语言实现的Socket通信相比,Qt封装了很多函数,使建立Socket通信更简单。新建一个QTcpSocket类的对象clientSocket,再调用connectToHost函数即可。
QTcpSocket *clientSocket;
QString ip = "127.0.0.1";
int port = 55000;
clientSocket = new QTcpSocket(this);
clientSocket->connectToHost(ip, port);//连接服务端