87 lines
2.0 KiB
C++
87 lines
2.0 KiB
C++
![]() |
#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="<<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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
Codec *codec_slave_get()
|
||
|
{
|
||
|
static Codec *codec_=nullptr;
|
||
|
if(codec_==nullptr){
|
||
|
codec_=new codec_slave();
|
||
|
}
|
||
|
return codec_;
|
||
|
}
|
||
|
|
||
|
|
||
|
codec_export(codec_slave,codec_slave_get);
|
||
|
|
||
|
|
||
|
|
||
|
|