#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()<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="<