产生上述问题的主要原因是当我们修改心跳时间后系统会调用​​OnHeartbeatProducerUpdate​​​这个函数去更新​​NextTime​​​的值,下面看看定时器中的处理:
这是一个1ms的定时器

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
{
TimeCNT++;

if (TimeCNT >= TIMER_MAX_COUNT)
{
TimeCNT=0;
}
if (TimeCNT == NextTime)
{
last_time_set = TimeCNT;
TimeDispatch(); //定时时间到,执行时间相关的分发任务
}
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}

当我们修改了​​NextTime​​​的值后会造成​​TimeCNT​​​的值大于​​NextTime​​​的值,所以​​TimeCNT​​​就会一直自加,直到大于​​TIMER_MAX_COUNT​​​清零后才会自动发送心跳包。
解决方法就是在​​​OnHeartbeatProducerUpdate​​这个函数中处理一下,加上这么一句:

if(NextTime>10)
TimeCNT=NextTime-10;
else
TimeCNT=0;