tuzhuke 发表于 2019-4-10 23:37:24

基站0串口数据刷新慢解决方案【代码优化】

@all 在最新版代码已经更新,可以直接使用最新版代码测试。 代码关注公众号即可下载。

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

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

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


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

    dwt_writetxdata(sizeof(angle_msg), angle_msg, 0);
    dwt_writetxfctrl(sizeof(angle_msg), 0);

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


gardenTED 发表于 2021-4-27 23:15:22

混个金币哈哈哈

gdzqltkj 发表于 2021-4-29 18:36:02

不错,期待测试

藏丶宝 发表于 2021-5-12 09:27:14

厉害啊,谢谢分享

13764295318 发表于 2021-6-9 10:16:24


混个金币哈哈哈

szmcumcu 发表于 2021-9-30 13:57:30

我也是混个金币,谢谢

sd196821 发表于 2021-10-15 18:02:45

感谢楼主的代码

Aran 发表于 2021-10-21 08:20:56

混个金币哈哈哈

Ialab2023 发表于 2023-3-9 16:29:47

非常好用!感謝樓主的資訊分享!

微风 发表于 2023-3-15 16:04:05

厉害啊,谢谢分享
页: [1]
查看完整版本: 基站0串口数据刷新慢解决方案【代码优化】