解决上位机协议中crc校验错误依然执行命令的问题

赋码仪新检测赋码命令测试成功
  解决找不到槽任务返回值的bug
  从机返回数据按地址排序
  解决从机无返回时报错异常通道与实际不符的bug
This commit is contained in:
ranchuan
2023-12-26 18:05:20 +08:00
parent 593cdbabdc
commit 8e7f3347d9
10 changed files with 84 additions and 18 deletions

View File

@@ -31,6 +31,13 @@
添加检测并写入流水号命令 添加检测并写入流水号命令
2023.12.25 2023.12.25
解决生成新赋码任务数据长度异常的bug 解决生成新赋码任务数据长度异常的bug
2023.12.26
解决上位机协议中crc校验错误依然执行命令的问题
赋码仪新检测赋码命令测试成功
解决找不到槽任务返回值的bug
从机返回数据按地址排序
解决从机无返回时报错异常通道与实际不符的bug

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-12-25 18:43:09" #define BUILD_DATE "2023-12-26 17:53:34"

View File

@@ -1,5 +1,5 @@
{ {
"build_date": "2023-12-25 18:43:09", "build_date": "2023-12-26 17:53:34",
"hard_version": "MHPZ2_V1.00", "hard_version": "MHPZ2_V1.00",
"private": [ "private": [
"info.json", "info.json",

View File

@@ -11,6 +11,7 @@ public:
Codec() Codec()
{ {
fullFrame = false; fullFrame = false;
failed = false;
} }
virtual ~Codec() {} virtual ~Codec() {}
// 返回true,则是一个完整的帧 // 返回true,则是一个完整的帧
@@ -31,7 +32,8 @@ public:
} }
return myarray(); return myarray();
} }
public:
bool failed;// true时解析失败
protected: protected:
bool fullFrame; bool fullFrame;
myarray data; myarray data;

View File

@@ -86,6 +86,7 @@ int CodecYm::packCheck(myarray data)
{ {
int ack = 0; int ack = 0;
offset=0; offset=0;
failed=false;
while(data.size()>=2){ while(data.size()>=2){
if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du)) if ((uint8_t(data[0]) != 0x59u) || (uint8_t(data[1]) != 0x6du))
{ {
@@ -129,6 +130,7 @@ int CodecYm::packCheck(myarray data)
// crc校验不对 // crc校验不对
qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]), qWarning("recv data check error:%02x,%02x %02x,%02x", chk_a, chk_b, int(data[data.size() - 2]),
int(data[data.size() - 1])); int(data[data.size() - 1]));
failed=true;
} }
// 保存此流水号 // 保存此流水号
cmd_no = data[5] | (data[6] << 8); cmd_no = data[5] | (data[6] << 8);

View File

@@ -25,7 +25,11 @@ HandlePc *handlePcFind(int cmd)
void ProtPc::init() void ProtPc::init()
{ {
if(syscfg()->tcp_enable==false){
if_ = interFaceFind("uart_host"); if_ = interFaceFind("uart_host");
}else{
if_ = interFaceFind("tcp");
}
codec_ = codecFind("codec_ym"); codec_ = codecFind("codec_ym");
if(if_==nullptr||codec_==nullptr){ if(if_==nullptr||codec_==nullptr){
return; return;
@@ -41,7 +45,11 @@ void ProtPc::init()
myarray data=codec_->decode(src,dst,cmd,recv_data); myarray data=codec_->decode(src,dst,cmd,recv_data);
recv_data.remove(0,pack_len); recv_data.remove(0,pack_len);
// qDebug("host recv removed:%s",recv_data.toHex(' ').data()); // qDebug("host recv removed:%s",recv_data.toHex(' ').data());
if(codec_->failed!=true){
docmd(cmd,data); docmd(cmd,data);
}else{
qWarning("host data decode failed.");
}
} }
}); });
} }

View File

@@ -221,19 +221,23 @@ int coder_slave_pack(myarray &d,int addr)
myarray coder_slave_find_ret_data(myarray data,int task_index,int size) myarray coder_slave_find_ret_data(myarray data,int task_index,int size)
{ {
myarray r; myarray r;
int task_len;
// qDebug()<<"find data,task_index="<<task_index<<"src="<<data.toHex(' ');
for(int i=0;i<data.size();) for(int i=0;i<data.size();)
{ {
task_len=data[i+1]*2;
if(data[i]==task_index){ if(data[i]==task_index){
r=data.mid(i+2,data[i+1]); r=data.mid(i+2,task_len);
break; break;
} }
i+=2+data[i+1]; i+=2+task_len;
} }
if(r.size()>=size){ if(r.size()>=size){
r=r.left(size); r=r.left(size);
}else{ }else{
int len=size-r.size(); int len=size-r.size();
r.append(len,uint8_t(0)); r.append(len,uint8_t(0));
qWarning("can not find data,append by 0.");
} }
return r; return r;
} }
@@ -512,7 +516,19 @@ myarray cmd_coder_code2::ret_slave_to_pc(QList<myarray> data)
r.append(uint8_t((addrs>>8)&0xff)); r.append(uint8_t((addrs>>8)&0xff));
r.append(uint8_t((addrs>>16)&0xff)); r.append(uint8_t((addrs>>16)&0xff));
r.append(uint8_t(coder_chip_type())); r.append(uint8_t(coder_chip_type()));
r.append(uint8_t(!syscfg()->coder_return_mode)); // coder_return_mode 1是完整模式,协议0是完整模式
if(syscfg()->coder_return_mode){
r.append(uint8_t(0));
r.append(13);
if(chip_mode==0){
r.append(15);
}else{
r.append(16);
}
}else{
r.append(uint8_t(1));
}
r.append(8);
for (int i=0;i<data.size();i++) for (int i=0;i<data.size();i++)
{ {
myarray &sdata=data[i]; myarray &sdata=data[i];
@@ -525,8 +541,9 @@ myarray cmd_coder_code2::ret_slave_to_pc(QList<myarray> data)
}else{ }else{
err=uint8_t(0xd0); err=uint8_t(0xd0);
} }
sdata.remove(0,1);
// 如果延时不对,则失败 // 如果延时不对,则失败
myarray sret=coder_slave_find_ret_data(sdata.mid(1),3,2); myarray sret=coder_slave_find_ret_data(sdata,3,2);
uint16_t sdelay=sret[0]|(sret[1]<<8); uint16_t sdelay=sret[0]|(sret[1]<<8);
if(sdelay!=delay){ if(sdelay!=delay){
if(err==0){ if(err==0){
@@ -535,11 +552,12 @@ myarray cmd_coder_code2::ret_slave_to_pc(QList<myarray> data)
} }
r.append(err); r.append(err);
// 添加工厂信息 // 添加工厂信息
sret=coder_slave_find_ret_data(sdata.mid(1),4,4); sret=coder_slave_find_ret_data(sdata,4,4);
r.append(sret); r.append(sret);
// 完整模式 // 完整模式
if(syscfg()->coder_return_mode){ if(syscfg()->coder_return_mode){
r.append(uid_codes[i].shell,13); r.append(uid_codes[i].shell,13);
// r.append(13,i+'0');
if(chip_mode==0){ if(chip_mode==0){
r.append(uid_codes[i].uid,15); r.append(uid_codes[i].uid,15);
}else{ }else{

View File

@@ -262,7 +262,7 @@ public:
} }
// pc回复命令,返回0不回复 // pc回复命令,返回0不回复
int cmd_pc_ret(){ int cmd_pc_ret(){
return 0x82; return 0x91;
} }
// 从机返回转pc // 从机返回转pc
myarray ret_slave_to_pc(QList<myarray> data); myarray ret_slave_to_pc(QList<myarray> data);

View File

@@ -871,20 +871,47 @@ void selfdev_runtask::timeout()
busy=0; busy=0;
} }
// 排序,再接收了从机数据之后
void selfdev_runtask::slave_sort(){
myarray temp;
int slave_num=slave_acked.size();
if(slave_num==0) return;
for(int i=0;i<slave_num;i++){
temp=slave_acked[i];
for(int j=i+1;j<slave_num;j++){
if(slave_acked[i][0]>slave_acked[j][0]){
slave_acked[i]=slave_acked[j];
slave_acked[j]=temp;
temp=slave_acked[i];
}
}
}
}
void selfdev_runtask::slave_end_slot(int addr,int ack, slave_data data) void selfdev_runtask::slave_end_slot(int addr,int ack, slave_data data)
{ {
qDebug("selfdev runtask end."); qDebug("selfdev runtask end.");
for(int i=0;i<data.size();i++){ // for(int i=0;i<data.size();i++){
qDebug("index=%d",i); // //qDebug("index=%d",i);
slave_ret slave=data.at(i); // slave_ret slave=data.at(i);
qDebug("index=%d end",i); // //qDebug("index=%d end",i);
// // 数据的第一位是来源的地址
// slave.data.insert(0,slave.addr);
// slave_acked.replace(i,slave.data);
// // qDebug("index=%d end 2",i);
// slave_acked_num++;
// }
for(int i=0;i<addrs.size();i++){
int addr=addrs[i];
myarray sdata=data[addr-1];
// 数据的第一位是来源的地址 // 数据的第一位是来源的地址
slave.data.insert(0,slave.addr); sdata.insert(0,addr);
slave_acked.replace(i,slave.data); slave_acked.replace(addr-1,sdata);
// qDebug("index=%d end 2",i);
slave_acked_num++; slave_acked_num++;
} }
if(cmd_pc_ret()!=0){ if(cmd_pc_ret()!=0){
slave_sort();
emit send_data_signal(cmd_pc_ret(),ret_slave_to_pc(slave_acked)); emit send_data_signal(cmd_pc_ret(),ret_slave_to_pc(slave_acked));
} }
busy=0; busy=0;

View File

@@ -288,6 +288,8 @@ public:
virtual myarray ret_slave_to_pc(QList<myarray> data)=0; virtual myarray ret_slave_to_pc(QList<myarray> data)=0;
public slots: public slots:
void slave_end_slot(int addr,int ack, slave_data data); void slave_end_slot(int addr,int ack, slave_data data);
protected:
void slave_sort();
protected: protected:
QList<myarray> slave_acked; QList<myarray> slave_acked;
int slave_acked_num; int slave_acked_num;