想要根据枚举类的不同读出结构体的内容,但总是报错
错误: D:\QT\5.15.2\study\AServer\aserver.cpp:111: error: invalid operands to binary expression ('QDataStream' and 'char')
怀疑过时版本问题,因为在同事电脑上能完美运行,调了一下版本还是不行。
结构体
#ifndef FRAMEDEFINITION_H
#define FRAMEDEFINITION_H
#include <QString>
struct FrameHead //帧头
{
char a = 0XEB;
char b = 0X90;
};
struct FrameEnd //帧尾
{
char a = 0X0D;
char b = 0X0A;
};
struct frameDate //数据帧
{
FrameHead framehead;
char framtype = '0';
char datetype = '0';
short datelenth;
QString data;
FrameEnd frameend;
};
struct frameControl //控制帧
{
FrameHead framehead;
char frametype ='0';
char controltype = '0';
FrameEnd frameend;
};
struct frameState //状态帧
{
FrameHead framehead;
char frametype ='0';
char controltype ='0';
FrameEnd frameend;
};
#endif // FRAMEDEFINITION_H
aserver.h
#ifndef ASERVER_H
#define ASERVER_H
#include "FrameDefinition.h"
#include <QWidget>
#include <QDomDocument>
#include <QDomElement>
#include<QDomProcessingInstruction>
#include <QMessageBox>
#include <QTcpSocket>
#include <QTcpServer>
#include <QUdpSocket>
#include <QHostAddress>
#include <QHostInfo>
#include <QTextStream>
#include <QIODevice>
#include <QDir>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class Aserver; }
QT_END_NAMESPACE
enum FreeType{Data,Control,State};
class QTcpServer;
class QTcpSocket;
class Aserver : public QWidget
{
Q_OBJECT
public:
Aserver(QWidget *parent = nullptr);
~Aserver();
protected:
QString getMessage();
QString ascllTohex(QByteArray array);
void showSource(QString sourceMessage);
void sendMessage(FreeType type);
bool createXML();
bool openXML();
bool writeXML(const QString &fileName);
bool readXML(const QString &fileName);
bool saveXML(const QString &fileName,QDomDocument &doc);
void listDom(QDomElement &docElem);
private:
Ui::Aserver *ui;
frameDate dataframe;
frameControl controlframe;
frameState stateframe;
QTcpServer *tcpserver;
QTcpSocket *tcpsocket;
QString IP;
QString TIP;
QUdpSocket *udp;
QUdpSocket *udpMulticast;
QByteArray tGetArray;
QByteArray tSetArray;
qint16 port;
qint16 tport;
bool ynSource = true;
QString time;
QString showMessage;
private slots:
void processPendingDatagrams();
void on_sourceBtn_clicked();
void on_sendBtn_clicked();
void on_checkBox_stateChanged(int arg1);
void on_comboBox_currentIndexChanged(int index);
};
#endif // ASERVER_H
aserver.cpp
void Aserver::processPendingDatagrams()
{
qDebug() << "tcpsocket进入了";
while (udp->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udp->pendingDatagramSize());
udp->readDatagram(datagram.data(),datagram.size());
QDataStream in(&datagram,QIODevice::ReadOnly);
int type;
in >> type;
time = QDateTime::currentDateTime()
.toString("yyyy-MM-dd hh:mm:ss");
switch (type)
{
case Data:
{
in >> dataframe.framehead.a >> dataframe.framehead.b >> dataframe.framtype >> dataframe.datetype >> dataframe.data
>>dataframe.data >> dataframe.frameend.a >> dataframe.frameend.b;
showMessage = dataframe.data;
showSource(showMessage);
break;
}
case Control:
{
break;
}
case State:
{
in >> stateframe.framehead.a >> stateframe.framehead.b >> stateframe.frametype >> stateframe.controltype
>>stateframe.frameend.a >> stateframe.frameend.b;
if (stateframe.controltype == '0')
{
ui->checkBox->setCheckState(Qt::Checked);
}
else
{
ui->checkBox->setCheckState(Qt::Unchecked);
}
break;
}
}
}
while (tcpsocket->bytesAvailable() != 0)
{
qDebug() << "读取了";
QDataStream in(tcpsocket);
int type;
in >> type;
time = QDateTime::currentDateTime()
.toString("yyyy-MM-dd hh:mm:ss");
switch (type)
{
case Data:
{
in >> dataframe.framehead.a >> dataframe.framehead.b >> dataframe.framtype >> dataframe.datetype >> dataframe.data
>>dataframe.datelenth >> dataframe.frameend.a >> dataframe.frameend.b;
showMessage = dataframe.data;
showSource(showMessage);
break;
}
case State:
{
in >> stateframe.framehead.a >> stateframe.framehead.b >> stateframe.frametype >> stateframe.controltype
>>stateframe.frameend.a >> stateframe.frameend.b;
if(stateframe.controltype == '0')
{
ui->checkBox->setCheckState(Qt::Checked);
}
else
{
ui->checkBox->setCheckState(Qt::Unchecked);
}
break;
}
}
}
}