TWR-400的测距代码怎么改成一标签对多标签的
因为要用到距离和rssi值,提供的测距代码中只能一标签对应一基站,想要改成一标签对应多个基站的,请问要怎么修改呢?首先,我们的代码是基于 我们自研的框架,你如果没有基础,可以参考下面两个链接学习下
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 修改为你的目标地址,可以把目标地址放到数组里,每次向一个基站发起测距
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 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
解决了,谢谢技术人员
赞:handshake:handshake
页:
[1]