From 51609746f25944b391aaccf8250070573b2e6dc8 Mon Sep 17 00:00:00 2001 From: andy Date: Thu, 7 Dec 2023 22:56:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=BF=E6=92=AD=E5=91=BD=E4=BB=A4=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=95=B0=E6=8D=AE=E9=87=8F=E8=87=AA=E5=8A=A8=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=8F=91=E9=80=81=E6=95=B0=E6=8D=AE=E7=9A=84=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/ReadMe.txt | 2 ++ source/codec/codec.c | 24 +++++++++++++++++++----- source/task/prot_uc.c | 17 +++++++++++++---- source/task/prot_uc.h | 4 +++- source/task/tran_for_slave.c | 4 ++-- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/source/ReadMe.txt b/source/ReadMe.txt index fbb7d7d..ddcd9e0 100644 --- a/source/ReadMe.txt +++ b/source/ReadMe.txt @@ -280,3 +280,5 @@ 添加广播命令的解析和回复指令 2023.12.5 使用定时器来精确控制数据发送的时间间隙,保证和其他小板不冲突 +2023.12.7 + 广播命令根据数据量自动计算发送数据的窗口时间 diff --git a/source/codec/codec.c b/source/codec/codec.c index 58dd569..a98b877 100644 --- a/source/codec/codec.c +++ b/source/codec/codec.c @@ -201,6 +201,16 @@ array_def *protu_encode2(protu_def *p,array_def *data) +// 计算在第n为之前,bit为1的个数 +static int calc_bit_num(int bits,int n) +{ + int num=0; + for(int i=0;isilent=1; p->timer->write(p->timer,0); + p->rank=calc_bit_num(dst_addrs,self_addr-1); + p->num=calc_bit_num(dst_addrs,32); arr_remove(r,0,3); }else{ arr_delete(r); @@ -263,6 +275,8 @@ array_def *protm_decode(protu_def *p,array_def *data) str_set(p->str_err,"bordcast without this."); } }else{ + p->rank=dst-1; + p->num=20;// 最多支持20个设备 p->silent=0; } return r; @@ -274,7 +288,7 @@ array_def *protm_encode(protu_def *p,array_def *data) { array_def *t=arr_creat(); param_check(t); - if(p->silent==0){ + // if(p->silent==0){ uint16_t len=arr_length(data)+10; arr_append(t,'Y'); arr_append(t,'e'); @@ -287,10 +301,10 @@ array_def *protm_encode(protu_def *p,array_def *data) arr_append(t,p->cmd_no>>8); arr_appends_from(t,data); arr_append(t,crc_crc8(arr_data(t),arr_length(t))); - }else{ - // 广播命令只需回复本机地址 - arr_append(t,elec_local_addr()); - } + // }else{ + // // 广播命令只需回复本机地址 + // arr_append(t,elec_local_addr()); + // } return t; } diff --git a/source/task/prot_uc.c b/source/task/prot_uc.c index 12128d0..e0de506 100644 --- a/source/task/prot_uc.c +++ b/source/task/prot_uc.c @@ -299,14 +299,23 @@ static send_pkt_def g_send_pkt; static void protu_send_ontime(protu_def *p,send_pkt_def *s) { uint32_t tick=p->timer->read(p->timer); - int delay=tick%100; - int gap=5*(elec_local_addr()-1); + // 根据返回的数据长度计算发送需要的时间,添加1ms的余量 + // 根据协议,每个指令从机的返回数据长度等长,所以需要的时间窗口也相等 + int wnd_tick=((arr_length(s->t)+15)/16+1); + int delay=tick%(wnd_tick*(p->num)); + int gap=p->rank*wnd_tick; if(delay<=gap){ delay=gap-delay; }else{ - delay=gap+100-delay; + delay=gap+(wnd_tick*(p->num))-delay; + } + if(p->silent!=0){ + // 广播命令在指定时间窗口发送 + later_execute(protu_send_later,s,delay); + }else{ + // 单播命令直接发送 + protu_send_later(s); } - later_execute(protu_send_later,s,delay); } diff --git a/source/task/prot_uc.h b/source/task/prot_uc.h index ec422a2..a0640b9 100644 --- a/source/task/prot_uc.h +++ b/source/task/prot_uc.h @@ -34,7 +34,9 @@ struct _protu_def{ uint8_t cmd; int is_big_data; codec_item *codec; - int silent;// 此项为1,不返回数据 + int silent;// 此项为1则是广播命令 + int rank;// 本机在广播命令中的排行,从0开始 + int num;// 本次广播命令包含的从机数量 timer_def *timer; }; typedef struct _protu_def protu_def; diff --git a/source/task/tran_for_slave.c b/source/task/tran_for_slave.c index cbc9760..84f8801 100644 --- a/source/task/tran_for_slave.c +++ b/source/task/tran_for_slave.c @@ -166,7 +166,7 @@ static void check_submit_later(void *t) array_def *ret=elec_check_result(); if(ret!=0){ emit tran_send_signal(s->tran,s->cmd,ret); - s->submit_delay+=elec_local_addr()*3; + // s->submit_delay=150; }else{ //while(1); } @@ -187,7 +187,7 @@ static void check_later(void *t) { s->submit_times=10; s->submit_running=1; - s->submit_delay=elec_local_addr()*10+200; + s->submit_delay=150; later_execute(check_submit_later,s,s->submit_delay); }else{ s->cmd=0;