Я пытаюсь написать класс для связи с микроволновым генератором с помощью 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
Большинство публикуемых c функций в классе просто вызывают 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-сокет и открывает его. После этого я несколько раз вызываю некоторые функции publi c из класса. Вот упомянутые функции:
<!-- 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());
}
Проблема в том, что после нескольких вызовов функций сокет становится недействительным. Переменная x1 становится ложной. Если я попытаюсь выполнить isWritable () или write (), произойдет ошибка сегментации. Что я делаю не так?
ОБНОВЛЕНИЕ: Я понял, в чем проблема. Я передал объект-генератор в функцию без ссылки и инициализировал соединение из этой функции. Итак, когда функция была выполнена, копия объекта была просто удалена, а сокет был удален вместе с ней. Затем я попытался отправить команду с помощью исходного объекта-генератора, который, естественно, не содержал никаких сокетов. Так что все это полностью моя вина.