添加读取电机步数命令
添加新赋码仪检测命令,赋码仪注码命令 添加检测并写入流水号命令
This commit is contained in:
@@ -25,4 +25,7 @@
|
||||
2023.12.21
|
||||
实现赋码仪命令
|
||||
升级小板程序失败时停止
|
||||
|
||||
2023.12.22
|
||||
添加读取电机步数命令
|
||||
添加新赋码仪检测命令,赋码仪注码命令
|
||||
添加检测并写入流水号命令
|
||||
|
@@ -89,7 +89,7 @@ void print_to_console(QtMsgType type, const QMessageLogContext &context, const Q
|
||||
QString current_date_time = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
|
||||
Q_UNUSED(current_date_time);
|
||||
if(context.file!=0){
|
||||
fprintf(stderr, "%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[20], context.line, localMsg.constData());
|
||||
fprintf(stderr, "%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[10], context.line, localMsg.constData());
|
||||
}else{
|
||||
fprintf(stderr,"%s | %s | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), localMsg.constData());
|
||||
}
|
||||
@@ -105,7 +105,7 @@ void print_to_file(QtMsgType type, const QMessageLogContext &context, const QStr
|
||||
{
|
||||
QTextStream tWrite(g_debug.file);
|
||||
if(context.file!=0){
|
||||
tWrite << QString::asprintf("%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[20], context.line, localMsg.constData());
|
||||
tWrite << QString::asprintf("%s | %s | %s:%u | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), &context.file[10], context.line, localMsg.constData());
|
||||
}else{
|
||||
tWrite << QString::asprintf("%s | %s | %s\n", msgHead[type], current_date_time.toLocal8Bit().constData(), localMsg.constData());
|
||||
}
|
||||
|
@@ -98,4 +98,6 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
|
||||
DISTFILES += \
|
||||
ReadMe.txt \
|
||||
ReadMe.txt
|
||||
ReadMe.txt \
|
||||
info.json \
|
||||
info.json
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
|
||||
#define BUILD_DATE "2023-12-21 18:29:22"
|
||||
#define BUILD_DATE "2023-12-22 18:08:01"
|
||||
|
||||
|
||||
|
||||
|
@@ -392,7 +392,7 @@ int elec_extract_chip(int id)
|
||||
// 找到异常代码序号
|
||||
int elec_report_err(elec_judge_def *e)
|
||||
{
|
||||
static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,9,20,0};
|
||||
static const uint8_t pro_table[]={1,3,7,8,2,4,5,6,9,10,20,0};
|
||||
uint8_t index=0;
|
||||
for (int i=0;i<sizeof(pro_table);i++){
|
||||
for(int j=0;j<ERR_LIST_LEN;j++){
|
||||
|
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"build_date": "2023-12-21 18:29:22",
|
||||
"build_date": "2023-12-22 18:08:01",
|
||||
"hard_version": "MHPZ2_V1.00",
|
||||
"private": [
|
||||
"info.json",
|
||||
"json.lua",
|
||||
"prints.lua"
|
||||
],
|
||||
"soft_version": "V2.00"
|
||||
"soft_version": "V2.01"
|
||||
}
|
@@ -291,7 +291,7 @@ private:
|
||||
emit send_data_signal(0x1f,cmd,s);
|
||||
// timer_retry_->start(300);
|
||||
//emit timeout_start_retry_signal(300);
|
||||
timeout_start_retry_cb(1000);
|
||||
timeout_start_retry_cb(2000);
|
||||
}else{
|
||||
// timer_retry_->stop();
|
||||
timeout_stop_retry();
|
||||
|
@@ -51,6 +51,7 @@ static const task_def g_ew_task_table[]={
|
||||
{"设置电阻校准值",37,1,1,0},
|
||||
{"读取流水号",38,5,2,2},
|
||||
{"写入流水号",39,5,2,0},
|
||||
{"写固定延时",40,5,1,0},
|
||||
{nullptr,0,0,0,0},
|
||||
};
|
||||
|
||||
@@ -106,6 +107,7 @@ static const task_def g_jq_task_table[]={
|
||||
{"设置电阻校准值",43,1,1,0},
|
||||
{"写入流水号",44,5,2,0},
|
||||
{"读取流水号",45,5,2,2},
|
||||
{"写固定延时",46,5,1,0},
|
||||
{nullptr,0,0,0,0},
|
||||
};
|
||||
|
||||
@@ -216,16 +218,24 @@ int coder_slave_pack(myarray &d,int addr)
|
||||
|
||||
|
||||
// 找到指定任务序号的数据
|
||||
myarray coder_slave_find_ret_data(myarray data,int task_index)
|
||||
myarray coder_slave_find_ret_data(myarray data,int task_index,int size)
|
||||
{
|
||||
myarray r;
|
||||
for(int i=0;i<data.size();)
|
||||
{
|
||||
if(data[i]==task_index){
|
||||
return data.mid(i+2,data[i+1]);
|
||||
r=data.mid(i+2,data[i+1]);
|
||||
break;
|
||||
}
|
||||
i+=2+data[i+1];
|
||||
}
|
||||
return myarray();
|
||||
if(r.size()>=size){
|
||||
r=r.left(size);
|
||||
}else{
|
||||
int len=size-r.size();
|
||||
r.append(len,uint8_t(0));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
@@ -251,7 +261,8 @@ myarray cmd_coder_check::ret_slave_to_pc(QList<myarray> data)
|
||||
for (int i=0;i<data.size();i++)
|
||||
{
|
||||
myarray &sdata=data[i];
|
||||
int addr=i+syscfg()->slave_addr_start;
|
||||
int addr=sdata[0]-1+syscfg()->slave_addr_start;
|
||||
sdata.remove(0,1);
|
||||
r.append(uint8_t(addr));
|
||||
if(sdata.size()>0){
|
||||
r.append(sdata[0]);
|
||||
@@ -286,8 +297,8 @@ protpc_export(0x01, get_coder_check);
|
||||
myarray cmd_coder_check2::cmd_pc_to_slave(myarray data)
|
||||
{
|
||||
myarray d;
|
||||
int chip=elec_extract_chip(check_plan()->get_plan_id());
|
||||
const task_def *table=nullptr;
|
||||
int chip=elec_extract_chip(check_plan()->get_plan_id());
|
||||
if(chip==0){
|
||||
uint16_t params[10]={20,4};
|
||||
coder_add_task(d,"读OTP",1,1,params);
|
||||
@@ -312,18 +323,16 @@ myarray cmd_coder_check2::ret_slave_to_pc(QList<myarray> data)
|
||||
for (int i=0;i<data.size();i++)
|
||||
{
|
||||
myarray &sdata=data[i];
|
||||
int addr=i+syscfg()->slave_addr_start;
|
||||
myarray sret=coder_slave_find_ret_data(sdata.mid(1),1);
|
||||
int addr=sdata[0]-1+syscfg()->slave_addr_start;
|
||||
sdata.remove(0,1);
|
||||
myarray sret=coder_slave_find_ret_data(sdata.mid(1),1,4);
|
||||
r.append(uint8_t(addr));
|
||||
if(sdata.size()==0){
|
||||
r.append(uint8_t(0xd0));
|
||||
r.append(8,uint8_t(0));
|
||||
}else{
|
||||
r.append(sdata[0]);
|
||||
if(sret.size()<4){
|
||||
sret.append(4-sret.size(),uint8_t(0));
|
||||
}
|
||||
r.append(sret.left(4));
|
||||
r.append(sret);
|
||||
r.append(4,uint8_t(0));
|
||||
}
|
||||
}
|
||||
@@ -404,7 +413,8 @@ myarray cmd_coder_code::ret_slave_to_pc(QList<myarray> data)
|
||||
for (int i=0;i<data.size();i++)
|
||||
{
|
||||
myarray &sdata=data[i];
|
||||
int addr=i+syscfg()->slave_addr_start;
|
||||
int addr=sdata[0]-1+syscfg()->slave_addr_start;
|
||||
sdata.remove(0,1);
|
||||
r.append(uint8_t(addr));
|
||||
if(sdata.size()>0){
|
||||
r.append(sdata[0]);
|
||||
@@ -431,6 +441,122 @@ protpc_export(0x02, get_coder_code);
|
||||
|
||||
|
||||
|
||||
// 赋码任务需要写入uid
|
||||
myarray cmd_coder_code2::cmd_pc_to_slave(myarray data)
|
||||
{
|
||||
myarray ret;
|
||||
const task_def *table=nullptr;
|
||||
uint16_t params[10]={0};
|
||||
chip_mode=elec_extract_chip(check_plan()->get_plan_id());
|
||||
char year[10]={0};
|
||||
delay=data[3]|(data[4]<<8);
|
||||
// 移除前4个字节使数据对齐
|
||||
data.remove(0,4);
|
||||
memcpy(year,data.mid(1,4).data(),4);
|
||||
qDebug("tran pc data to slave");
|
||||
for (int i=0;i<addrs;i++){
|
||||
myarray d;
|
||||
uid_code uid={{0},{0},{0},{0}};
|
||||
memcpy(uid.shell,data.mid(5+i*14+1,13).data(),13);
|
||||
if(check_shell_code(uid.shell)==1){
|
||||
// 只有管壳码验证通过时才计算uid和密码
|
||||
if(chip_mode!=0){
|
||||
coder_shell_to_uid(year,uid.shell,uid.uid);
|
||||
// 生成存储码
|
||||
coder_uid_to_save(uid.uid,(uint8_t *)uid.uid_psw);
|
||||
// 生成密码
|
||||
GetPasswordByUidCode((uint8_t *)uid.uid,(uint8_t *)&uid.uid_psw[8]);
|
||||
// 生成密码字符串
|
||||
sprintf(uid.psw,"%02X%02X%02X%02X",uid.uid_psw[8],
|
||||
uid.uid_psw[9],uid.uid_psw[10],uid.uid_psw[11]);
|
||||
}else{
|
||||
coder_shell_to_uid_jq(year,uid.shell,uid.uid);
|
||||
// 生成存储码
|
||||
UidCode_YM2JQ((PST_JQUID_TYPEDEF)uid.uid_psw,(PST_YMUID_TYPEDEF)uid.uid);
|
||||
// 生成密码
|
||||
JQ_GetPasswordByUidCode((uint8_t *)uid.uid,(uint8_t *)&uid.uid_psw[8]);
|
||||
// 生成密码字符串
|
||||
sprintf(uid.psw,"%02X%02X%02X%02X",uid.uid_psw[11],
|
||||
uid.uid_psw[10],uid.uid_psw[9],uid.uid_psw[8]);
|
||||
}
|
||||
}
|
||||
uid_codes.append(uid);
|
||||
params[0]=(8)|(4<<8);
|
||||
memcpy(¶ms[1],uid.uid_psw,12);
|
||||
coder_add_task(d,"配置三码数据到小板",1,1,params);
|
||||
params[0]=delay;
|
||||
coder_add_task(d,"写固定延时",1,2,params);
|
||||
coder_add_task(d,"读延时",2,3,params);
|
||||
if(chip_mode==0){
|
||||
uint16_t params[10]={20,4};
|
||||
coder_add_task(d,"读OTP",2,4,params);
|
||||
}else if(chip_mode==2){
|
||||
uint16_t params[10]={9,4};
|
||||
coder_add_task(d,"读MTP",2,4,params);
|
||||
}
|
||||
coder_slave_pack(d,i+1);
|
||||
ret+=d;
|
||||
}
|
||||
// 检测模式1,返回异常代码和任务插槽数据
|
||||
ret.insert(0,uint8_t(1));
|
||||
qDebug("tran pc data to slave end");
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 把从机回复的数据转化为上位机能理解的格式
|
||||
myarray cmd_coder_code2::ret_slave_to_pc(QList<myarray> data)
|
||||
{
|
||||
myarray r;
|
||||
r.append(uint8_t(addrs&0xff));
|
||||
r.append(uint8_t((addrs>>8)&0xff));
|
||||
r.append(uint8_t((addrs>>16)&0xff));
|
||||
r.append(uint8_t(coder_chip_type()));
|
||||
r.append(uint8_t(!syscfg()->coder_return_mode));
|
||||
for (int i=0;i<data.size();i++)
|
||||
{
|
||||
myarray &sdata=data[i];
|
||||
uint8_t err=0;
|
||||
int addr=sdata[0]-1+syscfg()->slave_addr_start;
|
||||
sdata.remove(0,1);
|
||||
r.append(uint8_t(addr));
|
||||
if(sdata.size()>0){
|
||||
err=sdata[0];
|
||||
}else{
|
||||
err=uint8_t(0xd0);
|
||||
}
|
||||
// 如果延时不对,则失败
|
||||
myarray sret=coder_slave_find_ret_data(sdata.mid(1),3,2);
|
||||
uint16_t sdelay=sret[0]|(sret[1]<<8);
|
||||
if(sdelay!=delay){
|
||||
if(err==0){
|
||||
err=10;
|
||||
}
|
||||
}
|
||||
r.append(err);
|
||||
// 添加工厂信息
|
||||
sret=coder_slave_find_ret_data(sdata.mid(1),4,4);
|
||||
r.append(sret);
|
||||
// 完整模式
|
||||
if(syscfg()->coder_return_mode){
|
||||
r.append(uid_codes[i].shell,13);
|
||||
if(chip_mode==0){
|
||||
r.append(uid_codes[i].uid,15);
|
||||
}else{
|
||||
r.append(uid_codes[i].uid,16);
|
||||
}
|
||||
}
|
||||
r.append(uid_codes[i].psw,8);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
static HandlePc *get_coder_code2(){
|
||||
return new cmd_coder_code2();
|
||||
}
|
||||
protpc_export(0x11, get_coder_code2);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -476,6 +602,57 @@ protpc_export(0x41, get_coder_setrtv);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 批检仪检测并写入流水号,控制电机需要重载此函数
|
||||
int cmd_checker_check::dolater(int cmd, myarray data)
|
||||
{
|
||||
prot_slave *slave=protSlave();
|
||||
mycfg *cfg_=syscfg();
|
||||
prot_m4 *m4 = protM4();
|
||||
busy=1;
|
||||
connect(this, &cmd_checker_check::send_to_m4_signal, m4, &prot_m4::send_data_slot);
|
||||
addrs=cmd_pc_to_addrs(data);
|
||||
moter_down_cb_fun=[=](myarray str)
|
||||
{
|
||||
m4->del_irq_fun(moter_down_cb_fun,"moter down");
|
||||
{
|
||||
// 这里开始检测
|
||||
qDebug("runtask.");
|
||||
HandleBoardCast *b=new slave_cmd();
|
||||
bool ack=slave->set_boardcast_handle(addrs,b);
|
||||
if(ack==false){
|
||||
qWarning("handle is busy.");
|
||||
busy=0;
|
||||
}else{
|
||||
connect(b,&HandleBoardCast::end_signal,this,&selfdev_runtask::slave_end_slot);
|
||||
// 广播设置校准值,需使用新增命令
|
||||
b->cmd=cmd_slave();
|
||||
b->start(cmd_pc_to_slave(data));
|
||||
if(cmd_pc_recv()!=0){
|
||||
emit send_data_signal(cmd_pc_recv(),cmd_pc_recv_to_pc());
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
myarray moter_cmd=moter_ctrl("down");
|
||||
if(moter_cmd.size()==0){
|
||||
busy=0;
|
||||
qWarning("moter failed.");
|
||||
}else{
|
||||
m4->set_irq_fun(moter_down_cb_fun,"moter down");
|
||||
emit send_to_m4_signal(moter_cmd);
|
||||
}
|
||||
slave_acked.clear();
|
||||
for(int i=0;i<addrs.size();i++){
|
||||
slave_acked.append(myarray());
|
||||
}
|
||||
slave_acked_num=0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// 批检仪检测并写入流水号
|
||||
myarray cmd_checker_check::cmd_pc_to_slave(myarray data)
|
||||
{
|
||||
@@ -495,6 +672,7 @@ myarray cmd_checker_check::cmd_pc_to_slave(myarray data)
|
||||
|
||||
// 检测模式0,返回原始检测结果
|
||||
ret.insert(0,uint8_t(0));
|
||||
// qDebug()<<"checker check pack data:"<<ret.toHex(' ');
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -504,7 +682,11 @@ myarray cmd_checker_check::ret_slave_to_pc(QList<myarray> data)
|
||||
myarray r;
|
||||
r.append(char(0));
|
||||
for(int i=0;i<data.size();i++){
|
||||
r.append(tran_slave_to_selfdev_check(data[i]));
|
||||
myarray &sdata=data[i];
|
||||
int addr=sdata[0]-1+syscfg()->slave_addr_start;
|
||||
sdata.remove(0,1);
|
||||
qDebug()<<"checker check ret data:"<<sdata.toHex(' ');
|
||||
r.append(tran_slave_to_selfdev_check(sdata));
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
@@ -219,6 +219,62 @@ protected:
|
||||
|
||||
|
||||
|
||||
// 赋码仪新赋码命令
|
||||
class cmd_coder_code2 : public selfdev_runtask
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
cmd_coder_code2():selfdev_runtask(){
|
||||
delay=0;
|
||||
}
|
||||
// pc指令转从机
|
||||
myarray cmd_pc_to_slave(myarray data);
|
||||
// pc指令生成从机列表
|
||||
QList<int> cmd_pc_to_addrs(myarray data){
|
||||
QList<int> addr_list;
|
||||
addrs=data[0]|(data[1]<<8)|(data[2]<<16);
|
||||
for(int i=0;i<20;i++){
|
||||
if((addrs&(1<<i))!=0){
|
||||
addr_list.append(i+1);
|
||||
}
|
||||
}
|
||||
return addr_list;
|
||||
}
|
||||
// 从机发起命令
|
||||
int cmd_slave(){
|
||||
return 0x20;
|
||||
}
|
||||
// pc收到回复,返回0不回复
|
||||
int cmd_pc_recv(){
|
||||
return 0x02;
|
||||
}
|
||||
// 生成接收回复到pc
|
||||
myarray cmd_pc_recv_to_pc(){
|
||||
myarray r;
|
||||
r.append(uint8_t(addrs));
|
||||
r.append(uint8_t(0));
|
||||
return r;
|
||||
}
|
||||
// pc回复命令,返回0不回复
|
||||
int cmd_pc_ret(){
|
||||
return 0x82;
|
||||
}
|
||||
// 从机返回转pc
|
||||
myarray ret_slave_to_pc(QList<myarray> data);
|
||||
protected:
|
||||
int addrs;
|
||||
int chip_mode;
|
||||
uint16_t delay;
|
||||
QList<uid_code> uid_codes;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 设置电阻校准值
|
||||
@@ -276,16 +332,26 @@ class cmd_checker_check : public selfdev_runtask
|
||||
public:
|
||||
cmd_checker_check():selfdev_runtask(){
|
||||
}
|
||||
~cmd_checker_check(){
|
||||
if(moter_down_cb_fun!=nullptr){
|
||||
// 取消电机下降到位回调
|
||||
prot_m4 *m4 = protM4();
|
||||
if(m4!=nullptr) {
|
||||
m4->del_irq_fun(moter_down_cb_fun,"moter ");
|
||||
}
|
||||
}
|
||||
}
|
||||
int dolater(int cmd, myarray data);
|
||||
// pc指令转从机
|
||||
myarray cmd_pc_to_slave(myarray data);
|
||||
// pc指令生成从机列表
|
||||
QList<int> cmd_pc_to_addrs(myarray data){
|
||||
QList<int> addr_list;
|
||||
addrs=0;
|
||||
// addrs=0;
|
||||
int len=data.size();
|
||||
for(int i=0;i<len;i+=5){
|
||||
addr_list.append(data[i]);
|
||||
addrs|=1<<(data[i]-1);
|
||||
// addrs|=1<<(data[i]-1);
|
||||
}
|
||||
return addr_list;
|
||||
}
|
||||
@@ -310,8 +376,11 @@ public:
|
||||
// 从机返回转pc
|
||||
myarray ret_slave_to_pc(QList<myarray> data);
|
||||
protected:
|
||||
int addrs;
|
||||
// int addrs;
|
||||
int mode;
|
||||
prot_m4_cb moter_down_cb_fun;
|
||||
signals:
|
||||
void send_to_m4_signal(myarray data);
|
||||
};
|
||||
|
||||
|
||||
|
@@ -277,6 +277,8 @@ int selfdev_moter::dolater(int cmd, myarray data)
|
||||
prot_m4 *m4 = protM4();
|
||||
mycfg *cfg_=syscfg();
|
||||
connect(this, &selfdev_moter::send_to_m4_signal, m4, &prot_m4::send_data_slot);
|
||||
if(cmd==0x40)
|
||||
{
|
||||
if(data[0]==0x02){
|
||||
emit send_to_m4_signal(moter_ctrl("up"));
|
||||
}else if(data[0]==0x03){
|
||||
@@ -289,7 +291,18 @@ int selfdev_moter::dolater(int cmd, myarray data)
|
||||
cfg_->save();
|
||||
}
|
||||
}
|
||||
emit send_data_signal(0x40,myarray(1,char(0)));
|
||||
emit send_data_signal(cmd,myarray(1,char(0)));
|
||||
return 0;
|
||||
}else if(cmd==0x47){
|
||||
myarray r;
|
||||
r.append(uint8_t(0));
|
||||
int count=cfg_->moter_count-20000;
|
||||
if(count<0) count=0;
|
||||
r.append(uint8_t(count&0xff));
|
||||
r.append(uint8_t((count>>8)&0xff));
|
||||
emit send_data_signal(cmd,r);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -302,6 +315,15 @@ static HandlePc *get_selfdev_moter(){
|
||||
}
|
||||
|
||||
protpc_export(0x40, get_selfdev_moter);
|
||||
protpc_export(0x47, get_selfdev_moter);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -853,8 +875,13 @@ void selfdev_runtask::slave_end_slot(int addr,int ack, slave_data data)
|
||||
{
|
||||
qDebug("selfdev runtask end.");
|
||||
for(int i=0;i<data.size();i++){
|
||||
qDebug("index=%d",i);
|
||||
slave_ret slave=data.at(i);
|
||||
slave_acked.replace(slave.addr-1,slave.data);
|
||||
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++;
|
||||
}
|
||||
if(cmd_pc_ret()!=0){
|
||||
|
@@ -9,7 +9,8 @@
|
||||
// 把小板的返回数据转化为自研批检仪上位机的格式
|
||||
myarray tran_slave_to_selfdev_check(myarray &data);
|
||||
|
||||
|
||||
// 电机控制
|
||||
myarray moter_ctrl(myarray op);
|
||||
|
||||
// 检测 自研批检仪
|
||||
class selfdev_check : public HandlePc
|
||||
|
@@ -0,0 +1 @@
|
||||
V2.00 重构主板程序,添加检测并写入流水号命令,只支持V2.09及以上的小板程序
|
Reference in New Issue
Block a user