陈一 发表于 2021-9-6 11:29:27

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

因为要用到距离和rssi值,提供的测距代码中只能一标签对应一基站,想要改成一标签对应多个基站的,请问要怎么修改呢?

蓝点无限 发表于 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
#define RX_NODE
//#define TX_NODE

#ifdef RX_NODE
#define SHORT_ADDR 0x0002
//#define LCD_ENABLE
#endif


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

#ifdef RX_NODE
#define SHORT_ADDR 0x0002
//#define LCD_ENABLE
#endif


#ifdef TX_NODE
#define SHORT_ADDR 0x0001
#endif
然后再修改标签的目标地址。
void BPhero_Distance_Measure_Specail_TAG(void)
{
    msg_f_send.destAddr =(SHORT_ADDR+1) &0xFF;
    msg_f_send.destAddr =((SHORT_ADDR+1)>>8) &0xFF;

      msg_f_send.seqNum = distance_seqnum;
    msg_f_send.messageData='P';//Poll message

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



陈一 发表于 2021-9-7 11:34:16

void BPhero_Distance_Measure_Specail_TAG(void)
{               

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

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

                                msg_f_send.seqNum = distance_seqnum;
                msg_f_send.messageData='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时,这里的代码我这样改有什么问题吗,改了之后行不通,可以帮我写一下两个基站的代码怎么改吗?

蓝点无限 发表于 2021-9-7 21:27:37

陈一 发表于 2021-9-7 11:34
void BPhero_Distance_Measure_Specail_TAG(void)
{               



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

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

                              msg_f_send.seqNum = distance_seqnum;
                msg_f_send.messageData='P';//Poll message

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

后面将数据发送出去

                        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;

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

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

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

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

陈一 发表于 2021-9-8 17:06:18

解决了,谢谢技术人员

蓝点无限 发表于 2021-9-8 21:34:10

陈一 发表于 2021-9-8 17:06
解决了,谢谢技术人员

赞:handshake:handshake
页: [1]
查看完整版本: TWR-400的测距代码怎么改成一标签对多标签的