Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ZigBee BitCloud 1.12 проблемы с координатором
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ZigBeeHelpMe
Есть вопрос по стеку BitCloud 1.12.0. Проблема над которой ломаю голову больше недели.
Есть координатор который принимает данные по UART и передает их роутеру. По не понятным мне причинам через 2-6 часов координатор зависает наглухо. В режиме дебага координатор в сеть вообще ничего не передает. sad.gif
Если ничего координатору по UART не передавать то проблем нет.

CODE
void appCoordinatorTaskHandler(AppEvent_t event, void *param)
{
param = param; // warning prevention

switch (appDeviceState)
{
case READING_SENSORS_STATE:
switch (event)
{
case APP_PROCESS:
appReadLqiRssi();
appSensorsesGot();
break;
case APP_READING_DONE:
appDeviceState = SENDING_DEVICE_STATE;
appPostSubTaskTask();
break;
default:
break;
}
break;
case SENDING_DEVICE_STATE:
switch (event)
{
case APP_PROCESS:
visualizeSerialTx();
appSendMessageToUsart(&appMessage.data, sizeof(AppMessage_t));
appDeviceState = STARTING_TIMER_STATE;
appPostSubTaskTask();
break;
default:
break;
}
break;
case STARTING_TIMER_STATE:
switch (event)
{
case APP_PROCESS:
HAL_StartAppTimer(&deviceTimer);
break;
case APP_TIMER_FIRED:
appDeviceState = READING_SENSORS_STATE;
appPostSubTaskTask();
break;
default:
break;
}
break;
case WAITING_DEVICE_STATE:
switch (event)
{
default:
appDeviceState = INITIAL_DEVICE_STATE;
appPostSubTaskTask();
break;
}
break;
case INITIAL_DEVICE_STATE:
switch (event)
{
case APP_PROCESS:
HAL_StopAppTimer(&deviceTimer);

deviceTimer.interval = APP_TIMER_SENDING_PERIOD;
deviceTimer.mode = TIMER_ONE_SHOT_MODE;
deviceTimer.callback = deviceTimerFired;

// Prefilling request parameters
messageParams.profileId = simpleDescriptor.AppProfileId;
messageParams.dstAddrMode = APS_SHORT_ADDRESS;
// Адресс устройства которому предназначено текущее сообщение (EXT_ADDRESS)
messageParams.dstAddress.extAddress = 0;
messageParams.dstAddress.shortAddress = 0x0012;
messageParams.dstEndpoint = 1;
messageParams.clusterId = CPU_TO_LE16(1);
messageParams.srcEndpoint = simpleDescriptor.endpoint;
// Длина полезной нагрузки
messageParams.asduLength = sizeof(appMessageBuffer.data);
// Полезная нагрузка
messageParams.asdu = (uint8_t*)(&appMessageBuffer.data[0]);
messageParams.txOptions.acknowledgedTransmission = 0;
#ifdef _APS_FRAGMENTATION_
messageParams.txOptions.fragmentationPermitted = 1;
#endif // _APS_FRAGMENTATION_
#ifdef _HIGH_SECURITY_
messageParams.txOptions.securityEnabledTransmission = 1;
#endif
messageParams.radius = 0x0;
messageParams.APS_DataConf = APS_DataConf;
appDeviceState = READING_SENSORS_STATE;
appPostSubTaskTask();
break;
default:
break;
}
break;

default:
break;
}
}

void appInitDeviceCoordinator(void)
{
appDeviceState = INITIAL_DEVICE_STATE;
appPostSubTaskTask();
}

static void appSensorsesGot(void)
{
appCoordinatorTaskHandler(APP_READING_DONE, NULL);
}

/// ***** Пользовательские функции реализация *****
static void APS_DataConf(APS_DataConf_t *confInfo)
{
data_arrived = true;
appPostSubTaskTask();
}

void dataUSARTRecived (void *data, uint16_t dataLength)
{
… парсер, заполнение данными messageParams ...
if ( data_arrived )
{
APS_DataReq(&messageParams);
data_arrived = false;
}
...
appPostSubTaskTask();
}
ataradov
Скорее всего вызывается APS_DataReq(&messageParams); до того как подтверждение от прошлого не пришло.

В большинстве случаев подтверждение приходит быстро, но если кадры теряются, то оно может занять до 30-40 секунд.
ZigBeeHelpMe
Цитата(Taradov Alexander @ Sep 8 2014, 17:45) *
Скорее всего вызывается APS_DataReq(&messageParams); до того как подтверждение от прошлого не пришло.

В большинстве случаев подтверждение приходит быстро, но если кадры теряются, то оно может занять до 30-40 секунд.


Спасибо, так и думал. Поставил таймаут. Тперь нужно подождать...
ataradov
QUOTE (ZigBeeHelpMe @ Sep 8 2014, 21:27) *
Спасибо, так и думал. Поставил таймаут. Тперь нужно подождать...


Нужно не таймаут ставить, а подтверждения ждать.
ZigBeeHelpMe
Цитата(Taradov Alexander @ Sep 9 2014, 05:28) *
Нужно не таймаут ставить, а подтверждения ждать.


Ну вроде так и делаю, жду когда APS_DataConf выполнится. timeout_callback там просто флаг разрешающий отправку следующего сообщения.
Вроде не виснет, 5 часов прошло..
Код
void APS_DataConf(APS_DataConf_t *confInfo)
{
    static HAL_AppTimer_t timeout;
    HAL_StopAppTimer(&timeout);
    timeout.mode     = TIMER_ONE_SHOT_MODE;
        timeout.callback = timeout_callback;
    if ( APS_SUCCESS_STATUS == confInfo->status )
        timeout.interval = 100;
    else
        timeout.interval = 50000;
    HAL_StartAppTimer(&timeout);    
    appPostSubTaskTask();
}
ataradov
Не нужен тут таймер. Задержка которая происходит в стеке, произойдет до вызова APS_DataConf(). После того как APS_DataConf() вызван можно снова вызывать APS_DataReq().

Вызвали APS_DataReq(), поставили флаг, вызвался APS_DataConf(), сняли флаг. Не нудно ждать дополнительно 50 секунд.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.