2023-11-26 23:05:35 +08:00
|
|
|
#include "codec_slave.h"
|
|
|
|
#include "base/crc.h"
|
|
|
|
|
|
|
|
myarray codec_slave::encode(int srcAddr, int dstAddr, int cmd, myarray data)
|
|
|
|
{
|
2023-11-27 14:31:00 +08:00
|
|
|
Q_UNUSED(srcAddr);
|
|
|
|
myarray t;
|
|
|
|
uint16_t len = data.size() + 10;
|
|
|
|
cmd_no++;
|
2023-11-26 23:05:35 +08:00
|
|
|
|
2023-11-27 14:31:00 +08:00
|
|
|
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;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
myarray codec_slave::decode(int &srcAddr, int &dstAddr, int &cmd, myarray data)
|
|
|
|
{
|
2023-11-27 14:31:00 +08:00
|
|
|
myarray r;
|
|
|
|
QString str_err = "ok";
|
2023-11-29 15:36:45 +08:00
|
|
|
|
|
|
|
if(data.size()==1){
|
|
|
|
srcAddr = data[0];
|
|
|
|
dstAddr = 0;
|
|
|
|
r.append(char(0));
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
2023-11-27 14:31:00 +08:00
|
|
|
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.";
|
2023-11-26 23:05:35 +08:00
|
|
|
return r;
|
2023-11-27 14:31:00 +08:00
|
|
|
}
|
|
|
|
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="<<src_addr<<" cmd_no error:host="<<h_no<<",slave="<<no<<endl;
|
|
|
|
// return r;
|
|
|
|
// str_err="cmd no err.";
|
|
|
|
}
|
|
|
|
if (crc != uint8_t(data[len - 1]))
|
|
|
|
{
|
|
|
|
// crc校验不对
|
|
|
|
qWarning("recv data crc check error:%02x,%02x", crc, uint8_t(data[len - 1]));
|
|
|
|
qWarning("data=%s", data.toHex(' ').data());
|
|
|
|
str_err = "crc check err.";
|
|
|
|
}
|
|
|
|
cmd = data[6];
|
|
|
|
r = data.mid(9, len - 10);
|
|
|
|
return r;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
Codec *codec_slave_get()
|
|
|
|
{
|
2023-11-27 14:31:00 +08:00
|
|
|
static Codec *codec_ = nullptr;
|
|
|
|
if (codec_ == nullptr)
|
|
|
|
{
|
|
|
|
codec_ = new codec_slave();
|
|
|
|
}
|
|
|
|
return codec_;
|
2023-11-26 23:05:35 +08:00
|
|
|
}
|
|
|
|
|
2023-11-27 14:31:00 +08:00
|
|
|
codec_export(codec_slave, codec_slave_get);
|