51uwb.cn

标题: 基站0串口数据刷新慢解决方案【代码优化】 [打印本页]

作者: tuzhuke    时间: 2019-4-10 23:37
标题: 基站0串口数据刷新慢解决方案【代码优化】
@all 在最新版代码已经更新,可以直接使用最新版代码测试。 代码关注公众号即可下载。

有同学反映串口数据发送间隔时间比OLED刷新慢,Review 代码发现这里有limitation,可以简单修改优化达到与OLED一样的刷新频率。

首先解释部分代码,代码为了实现多基站多标签功能,使用了类似分时复用以及锁的功能,具体可以参见我的博客:cnblogs.com/tuzhuke/p/10004456.html
优化1
对于基站,每个基站都有一个ID,从0开始,假如系统中有3个基站,就将代码中的宏定义ANCHOR_MAX_NUM 修改为3
  1. #define ANCHOR_MAX_NUM 3
复制代码
在实际工作中,标签发送数据给基站,实际上每个基站都可以收到标签的数据,只是有些基站不做反馈。 具体做法是这样的:标签发送数据带有序列号,序列号对ANCHOR_MAX_NUM 取模,例如序列号为10,取模后为1,那么只有ANCHOR1 处理这条信息
具体代码实现如下,即不符合的不执行。
  1. if(rx_buffer[ALL_MSG_SN_IDX]%ANCHOR_MAX_NUM != ANCHOR_IND)
  2.                 continue;
复制代码
对于测距的时候,上述方法可以很好的实现多基站多标签功能。

定位功能中,标签也会将收集到的数据发送给基站0,同样也有一个自增序列号,这条信息所有基站都会收到,只是基站0做反映。同样会走上面的判断
  1.   if(rx_buffer[ALL_MSG_SN_IDX]%ANCHOR_MAX_NUM != ANCHOR_IND)
  2.                 continue;
复制代码
此时,出现问题了,如果基站0收到信息序列号取模ANCHOR_MAX_NUM 不等于0,基站0 就不做处理,不会将这些信息发送给串口,违背了我们的意愿。所以观察到的结果是串口比OLED刷新慢。


解决方法: 标签在发送距离统计信息的时候讲序列号强制设置为0,基站0 就不会忽略这条信息了。
代码做如下修改:
  1. //only anthor0 recive angle message
  2.     angle_msg[ALL_MSG_SN_IDX] =0;
  3.     angle_msg[ALL_MSG_TAG_IDX] = TAG_ID;

  4.     dwt_writetxdata(sizeof(angle_msg), angle_msg, 0);
  5.     dwt_writetxfctrl(sizeof(angle_msg), 0);
复制代码


优化2:
从上面代码中可以看到一个比较重要的宏定义ANCHOR_MAX_NUM ,这个设定值不要小与实际基站数量。 最佳方案等于实际基站数量。
假如实际有2个基站,而这个宏定义为3,那么会出现如下情况:
对于tag 发来的信息序列号为0  1 2 3 4 ,0/3 1/4 分别有基站0和基站1接收, 而标记为2的数据谁也没有接收,白白浪费标签时间了。



作者: gardenTED    时间: 2021-4-27 23:15
混个金币哈哈哈
作者: gdzqltkj    时间: 2021-4-29 18:36
不错,期待测试
作者: 藏丶宝    时间: 2021-5-12 09:27
厉害啊,谢谢分享
作者: 13764295318    时间: 2021-6-9 10:16

混个金币哈哈哈
作者: szmcumcu    时间: 2021-9-30 13:57
我也是混个金币,谢谢
作者: sd196821    时间: 2021-10-15 18:02
感谢楼主的代码
作者: Aran    时间: 2021-10-21 08:20
混个金币哈哈哈
作者: Ialab2023    时间: 2023-3-9 16:29
非常好用!感謝樓主的資訊分享!
作者: 微风    时间: 2023-3-15 16:04
厉害啊,谢谢分享




欢迎光临 51uwb.cn (http://51uwb.cn/) Powered by Discuz! X3.3