From a95c209ade37589fa69990670da2506f5d10cc88 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期日, 22 六月 2025 16:47:29 +0800 Subject: [PATCH] 无感闸机测试可用版本,解决多标签时数组访问越界问题,存入授权表问题,但是多个设备的控制gpio的关断间隔过短,导致频繁开关未解决 --- keil/uwb_app.c | 86 +++++++++++++++++++++++++++++++++---------- 1 files changed, 66 insertions(+), 20 deletions(-) diff --git a/keil/uwb_app.c b/keil/uwb_app.c index 42e12c3..6cc31ff 100644 --- a/keil/uwb_app.c +++ b/keil/uwb_app.c @@ -449,7 +449,7 @@ ts2 >>= 8; } } - +uint8_t tt5=0; //void TagListUpdate(void) //{ // uint8_t i,j=0; @@ -481,6 +481,7 @@ taglist_num=j; if(find_flag) { +// if(tt5) find_in_tag_id_authorization_list(tag_id_authorization_list_num); find_flag=0; } @@ -690,30 +691,65 @@ void find_in_tag_id_authorization_list(uint32_t authorization_list_num) { - for (uint32_t i = 0; i < taglist_num; i++) { - uint32_t target = tagid_list[i]; - uint32_t left = 0; - uint32_t right = authorization_list_num - 1; // 授权列表的最大索引 - uint8_t found = 0; - - // 二分查找循环 - while (left <= right) { - uint32_t mid = left + ((right - left) >> 1); // 防止整数溢出 - uint32_t mid_val = tag_id_authorization_list[mid]; +// for (uint32_t i = 0; i < taglist_num; i++) { +// uint32_t target = tagid_list[i]; +// uint32_t left = 0; +// uint32_t right = authorization_list_num - 1; // 授权列表的最大索引 +// uint8_t found = 0; +// +// // 二分查找循环 +// while (left <= right) { +// uint32_t mid = left + ((right - left) >> 1); // 防止整数溢出 +// uint32_t mid_val = tag_id_authorization_list[mid]; +// +// if (mid_val == target) { +// found = 1; +// break; // 找到目标值,立即退出循环 +// } else if (mid_val < target) { +// left = mid + 1; +// } else { +// right = mid - 1; +// } +// LOG_INFO(TRACE_MODULE_APP, "DEBUG: i=%u, left=%d, right=%d, found=%u\n", i, left, right, found); +// } +//// +//// // 存储查找结果 +//// tag_authorized_List[i] = found; +// } +{ + // 如果授权列表为空,直接全部标记为0 + if (authorization_list_num == 0) { + for (int i = 0; i < taglist_num; i++) { + tag_authorized_List[i] = 0; + } + return; + } + + // 遍历需要查找的每个ID + for (int i = 0; i < taglist_num; i++) { + int key = tagid_list[i]; + int low = 0; + int high = authorization_list_num - 1; + int found = 0; // 标记是否找到 + + // 在授权列表中执行二分查找 + while (low <= high) { + int mid = low + (high - low) / 2; // 防止整数溢出 - if (mid_val == target) { - found = 1; - break; // 找到目标值,立即退出循环 - } else if (mid_val < target) { - left = mid + 1; + if (tag_id_authorization_list[mid] == key) { + found = 1; // 找到匹配项 + break; + } else if (tag_id_authorization_list[mid] < key) { + low = mid + 1; // 在右半部分继续查找 } else { - right = mid - 1; + high = mid - 1; // 在左半部分继续查找 } } - - // 存储查找结果 - tag_authorized_List[i] = found; + + // 根据查找结果设置输出列表 + tag_authorized_List[i] = found ? 1 : 0; } +} } int Anchor_App(void) @@ -765,9 +801,19 @@ memcpy(&tempid,&rx_buf[FZ_NEARBASEID_INDEX+i*2],2); if(tempid==dev_id) { + Anchor_RecNearPoll(i); tagdist_list[taglist_pos]=rec_ancdistlist[i]; anchordata_bat[taglist_pos] = battary;//保存该基站电量 + if(tag_authorized_List[taglist_pos]==1) + { + if(tagdist_list[taglist_pos]<100) + { + gpio_pin_set(BUTTON_PIN); + }else{ + gpio_pin_clr(BUTTON_PIN); + } + } if(taglist_pos==taglist_num)// taglist_pos==taglist_num 说明这个基站不在当前列表中 { //tempid==dev_id 说明基站下发测距报文有这个标签的信息 taglist_num++; //满足上述两种情况才会添加基站ID进入列表中,否则会出现标签不在基站列表中,标签也不响应的情况 -- Gitblit v1.9.3