关于cc1310下TI15.4协议栈 collector与 sensor中断连接问题

TI大神,你好!

请教问题如下

问题背景:

1、应用TI15.4协议栈LRM 模式 5k速率,每半小时sensor向collector发送一次数据,collector接收到sensor信息并串口打印;

2、collector与 sensor距离很近,经过实地测量平均信号强度为-87dbm;

3、collector配对6个sensor。

问题描述:

1、所有设备上电,系统正常稳定工作5小时左右,collector串口输出:

!Responding: 0x1
!Responding: 0x2
!Responding: 0x3
!Responding: 0x4
!Responding: 0x5
!Responding: 0x6

然后串口无信息输出。

2、故障出现几小时后,sensor不重启,重启collector后,sensor能够重新入网,并正常工作。

3、已经排除内存溢出的可能性、

4、怀疑会不会是串口引发的问题?

望大神不吝赐教!

  • 回复 YiKai Chen:

    也是个办法,有没有定时重启的demo或者例程,我们临时采用一下
  • 回复 user5153918:

    沒有這樣的例程,不過你只要起個timer event去做定时重启就好

    YK Chen

    如果回复解决了问题,请帮忙点击确认此为答案,谢谢

  • 回复 YiKai Chen:

    YiKai Chen你好:

    麻烦您帮忙分析下问题,或者帮忙提供一个解决方案,不胜感激!

    根据您的建议,我们在原有程序的基础上做了改进实验,改进包括:

    1.采用最新的15.4协议栈

    2.增加重启机制

    3.调整了TRACKING_DELAY_TIME 为CONFIG_REPORTING_INTERVAL(30min)

    实验内容:

    分别通过4个collector建立传感器网络(通过CONFIG_PAN_ID区分不同网络),其中1个网络可以保证完全与其他网络隔离

    存在问题:

    1.掉线问题依然存在

    与之前相同,正常运行数小时后,collector停止打印传感器传送的数据,由于TRACKING_DELAY_TIME设置为30min,collector未打印!Responding信息。

    在断线数十小时后,又能够恢复正常通信,collector正常打印sensor传送来的数据。

    2.重启机制执行无效

    目前我们涉及了两个计时器:1)collector启动后9小时重启;2)collector1.5小时内没有收到sensor消息则重启。

    目前看来两个重启策略都没有奏效,代码如下:

    时钟初始化增加重启始终初始化:

    static void initializeClocks(void)
    {
        /* Initialize the tracking clock */
        Csf_initializeRestartClock();
        Csf_initializeTrackingClock();
        Csf_initializeConfigClock();
        Csf_initializeBroadcastClock();
        Csf_initializeIdentifyClock();
    }

    重启时钟的初始化,其中RESTART_DELAY_TIME  32400000   (9小时)

    void Csf_initializeRestartClock(void)
    {
        /* Initialize the timers needed for this application */
        restartClkHandle = Timer_construct(&restartClkStruct,
                                           processCollectorRestartCallback,
                                           RESTART_DELAY_TIME,
                                            0,
                                            false,
                                            0);
    
        Timer_setTimeout(restartClkHandle, RESTART_DELAY_TIME);
        Timer_start(&restartClkStruct);
    
        restartClkHandle2 = Timer_construct(&restartClkStruct2,
                                           processCollectorRestartCallback,
                                           RESTART_DELAY_TIME,
                                            0,
                                            false,
                                            0);
    }
    //设置重启时钟:
    void Csf_setRestartClock(uint32_t restartTime)
    {
        /* Stop the restart timer */
        if(Timer_isActive(&restartClkStruct) == true)
        {
            Timer_stop(&restartClkStruct);
        }
    
        if(restartTime)
        {
            /* Setup timer */
            Timer_setTimeout(restartClkHandle, restartTime);
            Timer_start(&restartClkStruct);
        }
    }
    
    
    void Csf_setRestartClock2(uint32_t restartTime2)
    {
        /* Stop the restart timer */
        if(Timer_isActive(&restartClkStruct2) == true)
        {
            Timer_stop(&restartClkStruct2);
        }
    
        if(restartTime2)
        {
            /* Setup timer */
            Timer_setTimeout(restartClkHandle2, restartTime2);
            Timer_start(&restartClkStruct2);
        }
    }

    在collector主循环中增加如下代码:

        /* Allow the Specific functions to process */
        Csf_processEvents();
    
    #ifdef FEATURE_SECURE_COMMISSIONING
        /* Allow the security manager specific functions to process */
        SM_process();
    #endif /* FEATURE_SECURE_COMMISSIONING */
        /*处理串口发送事件*/
        if (Collector_events & COLLECTOR_CLOUD_SEND_EVT)
        {
    
            uint16_t sensorData2Cloud_string_LEN;
            /* Clear the event */
            Util_clearEvent(&Collector_events, COLLECTOR_CLOUD_SEND_EVT);
    
           …………………………………………
    
            TaskUARTWrite(Pak_sensorData2Cloud_string, Pak_sensorData2Cloud_string_LEN);//写串口
            Csf_free(sensorData2Cloud_string);
    Csf_setRestartClock2(7200000);//1.5hour restart 更新重启时间 }

    请您指导一下,有何问题。而导致两个重启动作都不生效。

    几点疑问:

    1. 环境因素是否影响协议栈正常工作?(温湿度,传感器间干扰等)

    2. collector匹配的传感器数量是否导致短线现象

    3.  ti15.4协议栈采碰撞避免算法是否有影响

    4. 新版本的协议栈与2.40协议栈有什么不同?

    相关配置情况:

    collector的配置如下:

    #define CONFIG_REPORTING_INTERVAL 1800000
    #define CONFIG_POLLING_INTERVAL 60000
    #define TRACKING_DELAY_TIME 1800000  //将默认值1min改为:30min与reporting时间先沟通
    #define  RESTART_DELAY_TIME 32400000 //新增重启时间(每9小时重启)

    sensor配置如下:

    #define CONFIG_POLLING_INTERVAL      60000
    #define CONFIG_PAN_ADVERT_SOLICIT_CLK_DURATION    60000
    #define CONFIG_PAN_CONFIG_SOLICIT_CLK_DURATION    60000
    #define CONFIG_REPORTING_INTERVAL  1800000//1800000  :  30min//
  • 回复 user5153918:

    1.请你抓包看一下是sensor 不发数据了,还是sensor发送了数据, collector不回复导致的leave。怀疑是内存问题导致了死机,可以适当的加大下面的值:

    MAC_CFG_TX_DATA_MAX 

    MAC_CFG_TX_MAX

    MAC_CFG_RX_MAX

    2.如果你数量不是过多不会有影响。

    3.CSMA/CA算法默认在协议中使用。

    4.请具体看协议中的说明:http://dev.ti.com/tirex/explore/node?node=ABot4AjbS-88ia3wbftauA__eCfARaV__LATEST

  • 回复 Alvin Chen:

    您说的内存问题具体是什么, 因为断线后,十几小时后会重新连接(期间无任何认为干扰),并且内存经过验证不会溢出?
    目前4个collector网络   分别配置6个、10个、12个、18个传感器并且都会出现断线情况

    经过测试sensor是发送了数据包的

    其实您建议的collector重启是目前一个很好的解决方案,但是经过测试,重启并没有奏效,请求帮助

  • 回复 user5153918:

    1.你的sensor 有没有正常按照poll rate 发送 data request.

    2.你如果说是collector 无法运行到你的重启定时器任务,是否为collector 跑飞或者死机,

    3.你除了修改那几个参数有没有修改一些其他东西。

    如果方便,你可以试一下完全没有改动的sensor/collector demo。

  • 回复 user5153918:

    两个重启策略都没有奏效?你是指collector時間到了沒有被重啟?你重啟的程序是在processCollectorRestartCallback?還有你有抓包檔可以分析問題嘛?

    YK Chen

    如果回复解决了问题,请帮忙点击确认此为答案,谢谢

  • 回复 YiKai Chen:

    callback只是setevent  :
    static void processCollectorRestartCallback(UArg a0) { (void)a0; /* Parameter is not used */ Util_setEvent(&Collector_events, COLLECTOR_RESTART_EVT); /* Wake up the application thread when it waits for clock event */ Semaphore_post(collectorSem); }

    collector的大循环中 加入事件响应并重启:

        if(Collector_events & COLLECTOR_RESTART_EVT)
            {
    
                CollectorAssertHandler();
                /* Clear the event */
                Util_clearEvent(&Collector_events, COLLECTOR_RESTART_EVT);
    
    
            }
    void CollectorAssertHandler(void)
    {
        /* User defined function */
        Main_assertHandler(MAIN_ASSERT_COLLECTOR_RESTART);
    }
    void Main_assertHandler(uint8_t assertReason)
    {
        Main_assertReason = assertReason;
    
    #if defined(RESET_ASSERT)
        Csf_assertInd(assertReason);
    
        /* Pull the plug and start over */
        SysCtrlSystemReset();
    #else
        Hwi_disable();
        while(1)
        {
            /* Put you code here to do something if in assert */
        }
    #endif
    }

  • 回复 user5153918:

    你調試你的這部份程序會看到系統重啟嘛?

    YK Chen

    如果回复解决了问题,请帮忙点击确认此为答案,谢谢