#ifndef DATATYPE_H #define DATATYPE_H #include #include #include #include #include #include #include #include #include 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 <(&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(&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