首页 > 解决方案 > QTcpSocket 失效

问题描述

我正在尝试编写一个使用 SCPI 与微波发生器通信的类。这里是它的头文件:

<!-- language: c++ -->
#ifndef GENERATOR_H
#define GENERATOR_H

#include <QTcpSocket>

class generator
{
public:
    generator(QString IP_port, unsigned int scpitimeout);
   ~generator();

    bool connectToGen();
    bool resetgen();
    QString getIDN();
    bool setFreq(double freq);
    bool setPow(double pow);
    bool ALCoff();
    bool setPW(double pw);
    bool setPRI(double pri);
    bool activatePmod();
    bool activateRFpow();
    bool deactivateRFpow();
    QString getlasterror();

private:
    QString genIP;
    QString IDstring;
    QString lasterror;
    unsigned int genPort;
    unsigned int timeout;

    // TCP/IP socket
    QTcpSocket *socket = nullptr;

    bool sendCommand(QString command);
    QString sendQuery(QString query);
};

#endif // GENERATOR_H

类中的大多数公共函数只是使用不同的参数调用 sendCommand() 或 sendQuery()。例如:

<!-- language: c++ -->
bool generator::activatePmod()
{
    if ( sendCommand(":PULM:STAT ON;\n") )
        return true;
    lasterror = "Some error text here.";
    return false;
}

QString generator::getIDN()
{
    return sendQuery("*IDN?;\n");
}

我通过以下方式与这门课一起工作。我通过创建类对象从另一个函数调用类构造函数。然后我调用 connectToGen() 函数。它创建 TCP/IP 套接字并打开它。在此之后,我多次从类中调用一些公共函数。以下是提到的功能:

<!-- language: c++ -->
generator::generator(QString IP_port, unsigned int scpitimeout)
{
    QStringList ipportlist = IP_port.split(QRegExp("(:)"));
    genIP = ipportlist.at(0);
    genPort = ipportlist.at(1).toUInt();
    timeout = scpitimeout;
}

bool generator::connectToGen()
{
    socket = new QTcpSocket(NULL);
    socket->connectToHost(genIP,genPort);
    if (!socket->waitForConnected(timeout)) {
        lasterror = "Some error.";
        return false;
}

bool generator::sendCommand(QString command)
{
    bool x1 = socket->isValid();
    bool x2 = socket->isWritable();
    socket->write(command.toLocal8Bit());
    if (!socket->waitForBytesWritten(timeout))
        return "";
    if (sendQuery("*OPC?;\n").toInt() != 1)
        return false;
   return true;
}

QString generator::sendQuery(QString query)
{
    socket->write(query.toLocal8Bit());
    if (!socket->waitForBytesWritten(timeout))
        return "";
    if (!socket->waitForReadyRead(timeout))
        return "";
   return QString(socket->readAll());
}

问题是在几个函数调用后socket变得无效。变量 x1 变为假。如果我尝试执行 isWritable() 或 write(),则会发生分段错误。我究竟做错了什么?

更新:我想出了问题所在。我将生成器对象传递给一个没有引用的函数,并从这个函数初始化了连接。所以当函数执行时,对象的副本刚刚被删除,socket也随之被删除。然后我尝试使用初始生成器对象发送命令,当然,它不包含任何套接字。所以这一切完全是我的错。

标签: c++qt

解决方案


推荐阅读