在sensor和collector通讯中,
sensor没发送一次数据,collector会及时回复。
流程:sensor发送数据,确认ACK回复正常,sensor发送poll,间隔是500,三次失败变成孤节点。
我现在是发送poll后,正常即刻来数据,但是有时候2分钟之后才过来数据。这个1-2分钟之内,sensor没有做其他事情。请问poll的回调没有超时机制吗?
为何二分钟之后才会有数据回调过来?下面是我的打印详细介绍
打印的发送数据内容
[15:21:06.006]收←◆ configInRam.AdcConfig.SN : 1301
[15:21:06.080]收←◆ :AllConfigTimeCurrentTime 17184
进入dataCnfCb回调
[15:21:06.579]收←◆dataCnfCb1
dataCnfCb 回调成功
[15:21:06.613]收←◆poll ApiMac_status_success3
启动poll事件
poll start event
发送poll请求
[15:21:06.665]收←◆sendPollReq
//接收poll回调 事件差是30S,才接收到
[15:21:36.198]收←◆pollCnfCb
//接收的协议解析
xieID: 1
dataId: 1
按照正常情况。poll发送后,会立即返回回调啊
Alvin Chen:
有的MAC_ACK_WAIT_DURATION
user5322468:
回复 Alvin Chen:
#define MAC_ACK_WAIT_DURATION0x40/* The maximum number of symbols to wait for an acknowledgment frame */
等待确认帧的最大符号数。都是默认的,这个定义的具体意思是什么?我现在最大的延迟,有2分钟。
Alvin Chen:
回复 user5322468:
”我现在是发送poll后,正常即刻来数据,但是有时候2分钟之后才过来数据“
你这个两分钟指的是ACK?
Alvin Chen:
回复 Alvin Chen:
MAC_ACK_WAIT_DURATION 超时是怎么算的,{offsetof(macPib_t, ackWaitDuration), sizeof(uint8), 54, 54},/* MAC_ACK_WAIT_DURATION */
举例,假如你是250kbps,4个bit 一个符号周期,也就是 16ms.54 * 16 = 864ms。
user5322468:
回复 Alvin Chen:
我这里二分钟是指的:发送poll到接收到poll的回调之间的时间差。
一次数据的交互流程是如下我说嘛?
因为我应用层需要改动,例子是长期poll,我这里是发送数据就poll。
sensor发送数据—–jdll中dataCnfCb回调Ack—-发送poll——等待jdll中poll回调——–然后在sensor中的dataindcb做数据处理。
MAC_ACK_WAIT_DURATION超时怎么计算也不可存在2分钟的超时。
我的是50kbps 433
Alvin Chen:
回复 user5322468:
50kbps 5x16ms=80ms
54x80s=4320ms
你去debug看看,感觉你的timestmap不准。
user5322468:
回复 Alvin Chen:
你是说我的定时器的时钟不准?这个我测试过,time完全正常。
除了你说的超时机制,还有什么会导致这种情况发生。上述的这种情况,10次通讯会出现2-4次。
我刚刚开了一个贴,没有人回复我的问题。
我能否跟你描述下?watchdog一移植到sensor上面,
在main方法里面直接初始化了看门狗。
void User_Watchdog_init(void){
Watchdog_Params params;
Watchdog_init();
params.resetMode=Watchdog_RESET_ON;
params.callbackFxn=(Watchdog_Callback)watchdogCallback;
Watchdog_Params_init(¶ms);
watchdog_handle=Watchdog_open(Board_WATCHDOG0,¶ms);
//Watchdog_convertMsToTicks(watchdog_handle,watchdogx)
Watchdog_setReload(watchdog_handle,watchdogx3S);#if defined(_DEBUGX)
LCD_WRITE_STRING("Watchdog_setReload", 1);
#endif
}void watchdogCallback(uintptr_t unusedint)
{
LCD_WRITE_STRING("watchdogCallback: ", 2);
}1、然后在sensor的where里面喂狗,我现在把喂狗给关了,应该是每三秒重启一次,我加入了打印信息。无法重启,
watchdogx3S=4500000
2、我把喂狗放在sensor的where,进入低功耗的时候(低功耗判断,没有事件触发),watchdog的计时继续执行。
Alvin Chen:
回复 user5322468:
首先你原始问题我不确定有其他原因。你两分钟之后才收到ack会触发devInfoBlock.dataFailures++吗?
此外你的这个看门狗并不合理吧,为什么要去重启设备呢? 通常是去开启一个定时器,定时去喂狗,你这个三秒也有点短了。举例如果你发送失败一次devInfoBlock.dataFailures++; 此时你的设备重启了类似这些值都会重置。
user5322468:
回复 Alvin Chen:
1、devInfoBlock.dataFailures++肯定是没有进入的。
因为我在devInfoBlock.dataFailures++的地方都有打印,而且dataFailures等于3,会成为孤节点,这些我都有打印信息。
sensor和collector能够正常通讯,300把数据交互中,除了在发送poll——收到poll回调,有延迟以外,其他的都是正常。
2、看门狗,没有喂狗,不是应该重启吗?我是仿真进去的,所以我第一次就断电重启了,让他自己输出打印,看,看门狗是否正常运行。我的喂狗,没有使用定时器,看doc,看门狗在低功耗下,是不做计时的。我sensor只要进入,低功耗,就不会喂狗,所以我把喂狗放在了where里面。看门狗是如何区分低功耗的。sensor_process==0吗?
user5322468:
回复 Alvin Chen:
我现在sensor/collector通讯,所有sensor突然都变成孤节点,(sensor发送数据collector ,无ACK回复)。collector 有串口心跳包正常运行。
sensor孤节点一直无响应。
TI中文支持网
