#include "codec_slave.h" #include "base/crc.h" myarray codec_slave::encode(int srcAddr, int dstAddr, int cmd, myarray data) { Q_UNUSED(srcAddr); myarray t; uint16_t len = data.size() + 10; cmd_no++; t.append('Y'); t.append('e'); t.append(len & 0xff); t.append(len >> 8); t.append(char(0)); // 源地址 t.append(char(dstAddr & 0xff)); // 目标地址 t.append(cmd); // 命令码 t.append(cmd_no & 0xff); t.append(cmd_no >> 8); t.append(data); t.append(crc::crc8((uint8_t *)t.data(), t.size())); return t; } myarray codec_slave::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data) { myarray r; QString str_err = "ok"; if(data.size()==1){ srcAddr = data[0]; dstAddr = 0; r.append(char(0)); return r; } if (data.size() < 10) { // 一帧数据至少10字节 qWarning("recv data len too less"); str_err = "recv data len too less."; return r; } uint16_t len = data[2] | (data[3] << 8); uint8_t crc = crc::crc8((uint8_t *)data.data(), data.size() - 1); if (len != data.size()) { // 如果长度不相等则产生了数据丢失 qWarning("recv data have lossed"); str_err = "recv data have lossed."; return r; } srcAddr = data[4]; dstAddr = data[5]; uint16_t no = data[7] | (data[8] << 8); uint16_t h_no = cmd_no; if (no != h_no) { // 发送一条指令应等待其返回,此时流水号应相同 // qWarning()<<"alave_addr="<