51uwb.cn

 找回密码
 立即注册
查看: 2824|回复: 5

TWR-400的测距代码怎么改成一标签对多标签的

[复制链接]

2

主题

5

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2021-9-6 11:29:27 | 显示全部楼层 |阅读模式
因为要用到距离和rssi值,提供的测距代码中只能一标签对应一基站,想要改成一标签对应多个基站的,请问要怎么修改呢?
回复

使用道具 举报

35

主题

936

帖子

3894

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3894
发表于 2021-9-6 21:46:08 | 显示全部楼层
首先,我们的代码是基于 我们自研的框架,你如果没有基础,可以参考下面两个链接学习下
http://51uwb.cn/forum.php?mod=viewthread&tid=165&extra=page%3D1
http://51uwb.cn/forum.php?mod=viewthread&tid=203&extra=page%3D1

有一定基础再改。一对一,改成一对多的大概流程,
建议一个标签,多个基站。
配置多个基站,如下方法,多个基站通过修改地址区分,例如下面的基站地址是0x0002,你可以修改成0x0003 等其它值
修改bphero_uwb.h
  1. #define RX_NODE
  2. //#define TX_NODE

  3. #ifdef RX_NODE
  4. #define SHORT_ADDR 0x0002
  5. //#define LCD_ENABLE
  6. #endif  
复制代码


之前代码,标签固定向某一个基站发起测试,改成一对多,需要首先定义设备为标签。
修改bphero_uwb.h
  1. //#define RX_NODE
  2. #define TX_NODE

  3. #ifdef RX_NODE
  4. #define SHORT_ADDR 0x0002
  5. //#define LCD_ENABLE
  6. #endif  


  7. #ifdef TX_NODE
  8. #define SHORT_ADDR 0x0001
  9. #endif  
复制代码

然后再修改标签的目标地址。
  1. void BPhero_Distance_Measure_Specail_TAG(void)
  2. {
  3.     msg_f_send.destAddr[0] =(SHORT_ADDR+1) &0xFF;
  4.     msg_f_send.destAddr[1] =  ((SHORT_ADDR+1)>>8) &0xFF;

  5.         msg_f_send.seqNum = distance_seqnum;
  6.     msg_f_send.messageData[0]='P';//Poll message
复制代码


把上面SHORT_ADDR+1 修改为你的目标地址,可以把目标地址放到数组里,每次向一个基站发起测距



回复

使用道具 举报

2

主题

5

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2021-9-7 11:34:16 | 显示全部楼层
void BPhero_Distance_Measure_Specail_TAG(void)
{               

                msg_f_send.destAddr[0] =(0x0002) &0xFF;
                msg_f_send.destAddr[1] =  ((0x0002)>>8) &0xFF;

                                msg_f_send.seqNum = distance_seqnum;
                msg_f_send.messageData[0]='P';//Poll message
       
       
       
                msg_f_send.destAddr[0] =(0x0003) &0xFF;
                msg_f_send.destAddr[1] =  ((0x0003)>>8) &0xFF;

                                msg_f_send.seqNum = distance_seqnum;
                msg_f_send.messageData[0]='P';//Poll message
       
       
       
       
                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);
                         dwt_writetxdata(psduLength ,(uint8 *)&msg_f_send, 0) ; // write the frame data
                                dwt_writetxfctrl(psduLength, 0);
                                dwt_starttx(DWT_START_TX_IMMEDIATE);
       
                while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
                { };

                                dwt_enableframefilter(DWT_FF_DATA_EN);
                dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS*10);
                                dwt_rxenable(0);

                                if(++distance_seqnum == 255)
                                                distance_seqnum = 0;
                Tag_State = TAG_POLL_SENT;
                                               
}

你好,如果两个基站的地址分别为0x0002和0x0003时,这里的代码我这样改有什么问题吗,改了之后行不通,可以帮我写一下两个基站的代码怎么改吗?
回复

使用道具 举报

35

主题

936

帖子

3894

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3894
发表于 2021-9-7 21:27:37 | 显示全部楼层
陈一 发表于 2021-9-7 11:34
void BPhero_Distance_Measure_Specail_TAG(void)
{               
  1.                msg_f_send.destAddr[0] =(0x0002) &0xFF;
  2.                 msg_f_send.destAddr[1] =  ((0x0002)>>8) &0xFF;

  3.                                 msg_f_send.seqNum = distance_seqnum;
  4.                 msg_f_send.messageData[0]='P';//Poll message
  5.       
  6.       
  7.       
  8.                 msg_f_send.destAddr[0] =(0x0003) &0xFF;
  9.                 msg_f_send.destAddr[1] =  ((0x0003)>>8) &0xFF;

  10.                                 msg_f_send.seqNum = distance_seqnum;
  11.                 msg_f_send.messageData[0]='P';//Poll message
复制代码


你这个部分有问题,设定基站地址0x0002,第一个数据为P,然后由设定地址0x0002,第一个数据为P

后面将数据发送出去

  1.                         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, !GPIO_PIN_RESET);
  2.                          dwt_writetxdata(psduLength ,(uint8 *)&msg_f_send, 0) ; // write the frame data
  3.                                 dwt_writetxfctrl(psduLength, 0);
  4.                                 dwt_starttx(DWT_START_TX_IMMEDIATE);
  5.       
  6.                 while (!(dwt_read32bitreg(SYS_STATUS_ID) & SYS_STATUS_TXFRS))
  7.                 { };

  8.                                 dwt_enableframefilter(DWT_FF_DATA_EN);
  9.                 dwt_setrxtimeout(RESP_RX_TIMEOUT_UUS*10);
  10.                                 dwt_rxenable(0);

  11.                                 if(++distance_seqnum == 255)
  12.                                                 distance_seqnum = 0;
  13.                 Tag_State = TAG_POLL_SENT;
复制代码


这样执行代码,后面的地址覆盖了前面的地址信息,只有向基站地址为0x0003 发送了信息。

可以将地址信息放到一个数组里,例如
uint16 short_address[2] =[0x0002,0x0003]; //放到函数外面,全部变量
uint16 index = 0;//放到函数外面,全部变量

//下面的代码放到函数内
msg_f_send.destAddr[0] =( short_address[index ]) &0xFF;
msg_f_send.destAddr[1] =  ((short_address[index ])>>8) &0xFF;
index++;
if(index == 2)
index = 0;

代码大概逻辑这样,具体你调试吧
回复

使用道具 举报

2

主题

5

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2021-9-8 17:06:18 | 显示全部楼层
解决了,谢谢技术人员
回复

使用道具 举报

35

主题

936

帖子

3894

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3894
发表于 2021-9-8 21:34:10 | 显示全部楼层
陈一 发表于 2021-9-8 17:06
解决了,谢谢技术人员

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

bphero Inc.  

GMT+8, 2024-3-19 10:08 , Processed in 0.014441 second(s), 4 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表