拦路虎啊!AF_DataRequest无规律发送失败,没人能解决吗?
原本想过年好好休息一下,想在休息不了了,我的ZigBee终端模块每5秒调用一次AF_DataRequest函数发信息给协调器(单播),出现一个问题,就是工作几个小时后或几十分钟(时间不等),就会出现发送失败,错误代码是0xc2。失败后有时过会能自行恢复,有时要重启,请各位大神帮忙解决。谢谢!
0XC2的错误是校准失败,我也遇到同样的问题,一段时间后,无线这块就死掉了,但是 CC2530的MCU还是好的
节点在出现问题的时候,是否有断线过,也就是发送Data Request给父节点,但是父节点没有回复MAC ACK,使得节点失去父节点掉线了。
然后需要重新入网,但是你的应用层还是一直在调用AF_DataRequest
我的是协调器会死掉。。但是CC2530的MCU是好的 RF会死掉,,然后下面路由设备能够入网,但是协调不能给他发送KEY,,重启就可以
昨天晚上定位了一下问题,AF_DataRequest 在发送的时候 会出现 0x10 和0x00 这两种昨天,但是MAC层的发送接口 macTxFrame是没有被调用到。也就是发送数据死掉在网络层。请问这是什么情况导致,求TI技术大师支持。
0xC2这种情况是 链路请求失败的时候 会发送这个
谢谢VV老师!请多指教,已经困惑一个月了,怎样判断是否有断线过(很可能是这种情况),但为什么会出现断线,出现断线后怎样才能在不复位的情况下重新入网?请指教!再次感谢!
这个问题 你在普通的群里面都可以知道答案。。这里还是让TI大师帮我们解决根本问题
@Tao,
返回0x00,是正常的,Success
返回0x10,是#define afStatus_MEM_FAIL ZMemError /* 0x10 */
程序里面是否有动态申请内存,没有释放的,
调试方法,
在osal_memory.c文件中,把下面的宏定义打开
// For information about memory profiling, refer to SWRA204 "Heap Memory Management", section 1.5.
#if !defined OSALMEM_PROFILER
#define OSALMEM_PROFILER TRUE // Enable/disable the memory usage profiling buckets.
#endif
#if !defined OSALMEM_PROFILER_LL
#define OSALMEM_PROFILER_LL FALSE // Special profiling of the Long-Lived bucket.
#endif
用IAR调试下用户内存动态分配的Heap的使用情况,详细参考附件的文档。
6318.Heap Memory Management.pdf
@yi l
你用抓包看下,是否有断线就知道了。
你在程序里面去检查_NIB.nwkState的值,也可以知道的
typedef enum
{
NWK_INIT,
NWK_JOINING_ORPHAN,
NWK_DISC,
NWK_JOINING,
NWK_ENDDEVICE,
PAN_CHNL_SELECTION,
PAN_CHNL_VERIFY,
PAN_STARTING,
NWK_ROUTER,
NWK_REJOINING
} nwk_states_t;
0x10 我程序是会用到内存分配 但是 数据发送完后我就释放 了 还有就是0x10不是一直出现,偶尔出现。。但是这都不是核心,核心是 我发送数据 返回0X00 但是数据没有被MAC层发出去。MAC层的函数都没有被调用
VV老师 这个 宏开起来 是不是 就是系统自己分配了 。
VV老师 为什么 数据发送 memAlo 这个值会增加 当增加到 0xA55的时候 数据就发送不了了 。
@tao,
这个宏打开只是为了调试看你的动态申请的内存的情况,将来产品量产的时候肯定要关闭这个宏的。
我是怀疑,你的程序是不是有内存申请,但是没有释放的情况。
这样的话导致memory allocate不成功。
谢谢,VV老师,快过年了还抽出时间给我们解答,这个问题已经搞清楚了 ,就是内存分配问题, 我想弄清楚的不是这个 我想要知道 ,为什么内存已经分配不出内存了 ,而发送函数 居然还是返回0x00,数据都发不出去了
如果是返回的0x00,那么内存分配肯定是没问题的,不然早就return错我了。
但是内存分配成功,不一定数据能成功发送出去,还涉及到其他的问题。
还请VV老师 明细 问题点
数据是否发出去,是由AF_DATA_CONFIRM决定的。ZigBee协议的数据发送,AF_DataRequest,你可以把它看作你要寄一个快递首先联系快递公司,函数返回成功,好比快递员来收了你的物品,但是快递员收了你的物品并不代表你的货物可以100%寄到。ZigBee网络是一个很复杂的网络拓扑,不过可以给你一些经验,如果你的协调器要发数据给终端节点,终端节点可以定期调用ZDApp_AnnounceNewAddress函数(建议半分钟到一分钟为一个周期),这个函数可以随时刷新协调器到各个节点的路由路径。
当我 协调 路由组网成功后,我关闭 路由器,协调发发数据返回 0xC2。你说的是路径请求。返回0x00 是在 APSDE_DataReq返回值,这个情况下 路径是有的。只是内存分配失败会出现
谢谢各位老师的回复!现在有一点搞清了,就是终端节点失去父节点造成的,但为什么会无规律的失去父节点呢?联网很正常,有没有断电,还请各位老师和高手知道。谢谢!注大家春节愉快!
这个取决于你的程序,还有环境,wifi 等其他2.4G干扰导致,还有就是 终端节点 一般不要乱用,当作为电池设备的时候一般是用终端设备。因为终端设备本身不能接受数据,他是找父节点 获取数据的,当获取失败一定次数,终端就会断网。 父设备保存子数据的时间是7秒钟,这个时间是可以设置的,但是不要乱设置。会出问题。
你好,Aries Lord!请问下怎么调用AF_DATA_CONFIRM来确定数据是否发出去了?谢谢了