#ifndef DATATYPE_H #define DATATYPE_H #include <QObject> #include <QDataStream> #include <QByteArray> #include <QDebug> #include <QBuffer> #include <QBuffer> #include <QDataStream> #include <QByteArray> #include <QDebug> struct DataPacket { quint8 frameHeader; // 帧头 (1 byte) quint32 packetSeq; // 包序号 (4 bytes) quint16 dataLength; // 数据块长度 (2 bytes) quint8 batteryLevel; // 电量 (1 byte) quint8 channelCount; // 通道数量 (1 byte) qint16 pitchAngle; // 俯仰角 (2 bytes) qint16 rollAngle; // 滚动角 (2 bytes) qint16 yawAngle; // 偏航角 (2 bytes) quint16 ecg; // 心电 (2 bytes) quint16 spo2; // 血氧 (2 bytes) quint8 reserved1; // 预留1 (1 byte) quint8 reserved2; // 预留2 (1 byte) quint8 reserved3; // 预留3 (1 byte) quint8 reserved4; // 预留4 (1 byte) QByteArray dataBlock; // 数据块 (192 bytes 或 6 bytes) quint8 syncSource; // 同步触发源 (1 byte) quint8 syncSeq; // 同步触发序号 (1 byte) quint8 checksum; // 校验和 (1 byte) quint16 packetTail; // 包尾 (2 bytes) // 序列化头部 void serializeHeader(QDataStream &out ) { out <<frameHeader <<packetSeq << dataLength << batteryLevel << channelCount << pitchAngle << rollAngle << yawAngle << ecg << spo2 << reserved1 << reserved2 << reserved3 << reserved4; } // 序列化整个数据包 QByteArray serialize() { QByteArray buffer; QBuffer bufferDevice(&buffer); bufferDevice.open(QIODevice::WriteOnly); QDataStream out(&bufferDevice); out.setVersion(QDataStream::Qt_5_13); serializeHeader(out); // 序列化头部,但不包括校验和 out.writeRawData(dataBlock.data(), dataBlock.size()); out << syncSource << syncSeq; out << checksum; out << packetTail; return buffer; } // 反序列化整个数据包 void deserialize(const QByteArray &buffer) { QBuffer bufferDevice(const_cast<QByteArray*>(&buffer)); bufferDevice.open(QIODevice::ReadOnly); QDataStream in(&bufferDevice); in.setVersion(QDataStream::Qt_5_13); in >>frameHeader >> packetSeq >> dataLength >> batteryLevel >> channelCount >> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2 >> reserved1 >> reserved2 >> reserved3 >> reserved4; dataBlock.resize(dataLength); in.readRawData(dataBlock.data(), dataLength); in >> syncSource >> syncSeq; in >> checksum; in >> packetTail; } void deserializeHeader(const QByteArray &buffer) { QBuffer bufferDevice(const_cast<QByteArray*>(&buffer)); bufferDevice.open(QIODevice::ReadOnly); QDataStream in(&bufferDevice); in.setVersion(QDataStream::Qt_5_13); in >>frameHeader>> packetSeq >> dataLength >> batteryLevel >> channelCount >> pitchAngle >> rollAngle >> yawAngle >> ecg >> spo2 >> reserved1 >> reserved2 >> reserved3 >> reserved4; } }; #endif // DATATYPE_H