发 帖  
原厂入驻New
[问答] EasyLink_enableRxAddrFilter使用时增加地址长度返回错误状态
2020-3-27 08:53:11  161 Mac IEEE
分享
我想使用EasyLink_enableRxAddRFilter来过滤接收到的数据包,我想使用芯片8位IEEE MAC地址来作为过滤地址。
因此我使用一个uint8_t addrFilter[8]数组存放MAC地址,然后如下调用:
EasyLink_enableRxAddrFilter(addrFilter, 8, 1),发现返回错误状态:EasyLink_Status_Param_Error
然后调试跟踪,发现有个变量默认设置为1,
//Addr size for Filter and Tx/Rx operations
//Set default to 1 byte addr to work with SmartRF
//studio default settings
static uint8_t addrSize = 1;
请问一下,这里所说的smartRF studio defaultsettings也是1,如果用8字节地址作为过滤的话,是不是需要对应修改smartrf_settings.c文件呢?
0
2020-3-27 08:53:11   评论 分享淘帖
9 个讨论
说一下我自己的测试结果吧,
我设置一个node的发送地址为:8字节全0x00
collector的地址过滤数组为一个16字节数组:a[16],当然为了方便查看,实际定义的是一个结构体,里面放了两个8字节的一维数组,然后调用:EasyLink_enableRxAddrFilter((uint8_t *)(a), 8, 2);这样就设置了两个8字节的过滤地址。
如果直接这么调用,按帖子所说,会返回错误,需要同时修改EasyLink.c文件里面的addrSize,有两个地方将该变量赋值为1,同步改为8。
做如下测试:
当数组a[]前8字节或后8字节全为0时,collector可以接收node的发送数据;
当数组a[]前8直接为0XBB,后8字节为非0数据时,不能收到node的发送数据。
仅供参考。
2020-3-27 08:59:33 评论

举报

dlkmad 发表于 2020-3-27 15:23
说一下我自己的测试结果吧,
我设置一个node的发送地址为:8字节全0x00
collector的地址过滤数组为一个16字节数组:a[16],当然为了方便查看,实际定义的是一个结构体,里面放了两个8字节的一维数组,然后调用:EasyLink_enableRxAddrFilter((uint8_t *)(a), 8, 2);这样就设置了两个8字节的过滤地址。

当数组a[]前8直接为0XBB,后8字节为非0数据时,其实是可以收到node的发送数据,只不过你需要在node的那边修改发送地址
2020-3-27 09:15:15 评论

举报

hi,
Eggsy Pang,我是这么设置的,node的发送地址为依然为8字节全0, collector过滤地址a[]的前8字节为8个0XBB, 后8字节为8个0xAA,这样collector收不到node发送的数据。
按照你的意思是需要修改node的发送地址为其他数据?为什么我设置node的地址全为0时,collector是搜索不到数据的呢 ?
2020-3-27 09:27:10 评论

举报

dlkmad 发表于 2020-3-27 15:51
hi,
Eggsy Pang,我是这么设置的,node的发送地址为依然为8字节全0, collector过滤地址a[]的前8字节为8个0XBB, 后8字节为8个0xAA,这样collector收不到node发送的数据。
按照你的意思是需要修改node的发送地址为其他数据?为什么我设置node的地址全为0时,collector是搜索不到数据的呢 ? ...

你把node的发送地改为collector的过滤地址,试试看
2020-3-27 09:47:02 评论

举报

我上面的意思就是想测试一下什么情况下不能收到,数组a[]改为0xAA和0xBB就是想验证node发送地址为0x00时候,collector就收不到;node发送的数据了。
2020-3-27 09:57:45 评论

举报

我感觉你理解错误filter的概念了,collector在数组里定义了地址,首先node发过来一个地址,collector会把收到的地址和数组里面的值进行对比,如果地址过滤长度为1,那只拿收到的地址和a[0]对比,如果地址过滤长度为3,那对比a[0] a[1] a[2],只要有一个正确,就可以接收
2020-3-27 10:13:37 评论

举报

hi~
Eggsy Pang ,我是这么理解的。
node定义了一个8字节的地址:nodeAddr[8] = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07,0x08]
collector定义两个过滤地址:collectorAddr1[8],   collectorAddr2[8]
将collector过滤地址封装在一个结构体中:
Struct CollectorFilterAddr
[
char collectorAddr1[8],  
char collectorAddr2[8]
]collectorFilterAddr;
然后调用接口函数设置接收过滤地址:
EasyLink_enableRxAddrFilter((uint8_t *)(&collectorFilterAddr), 8, 2);

若果在collector端设置的地址collectorAddr1[],   collectorAddr2[]中有一个和node的发送地址nodeAddr[]相同(8个字节数据依次完全相同),那么可以接收,若果不相同则接收不到。
按照我的理解,node和collector的地址长度应该保持一致。不知道理解是否正确,还望释疑。感谢。
2020-3-27 10:32:45 评论

举报

dlkmad 发表于 2020-3-27 16:56
hi~
Eggsy Pang ,我是这么理解的。
node定义了一个8字节的地址:nodeAddr[8] = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06,0x07,0x08]

没错,你现在这个理解是对的
2020-3-27 10:51:18 评论

举报

uuwufydsw 发表于 2020-3-27 17:15
没错,你现在这个理解是对的

好的,谢谢Eggsy Pang ,我最开始是这么理解的,之前没说清楚,不好意思。
2020-3-27 11:09:33 评论

举报

只有小组成员才能发言,加入小组>>

1190个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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