重新构建的批检仪主板程序

This commit is contained in:
andy
2023-11-26 23:05:35 +08:00
parent b1b69d307f
commit 4a70f64693
29 changed files with 2565 additions and 64 deletions

86
interface/codec_slave.cpp Normal file
View File

@@ -0,0 +1,86 @@
#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);