реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ZigBee BitCloud 1.12 проблемы с координатором, Передача данных от компа роутеру или конечному устройству
ZigBeeHelpMe
сообщение Sep 8 2014, 09:15
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 16-10-12
Из: Урал
Пользователь №: 73 966



Есть вопрос по стеку 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();
}


Сообщение отредактировал IgorKossak - Sep 8 2014, 10:45
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
ataradov
сообщение Sep 8 2014, 16:45
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



Скорее всего вызывается APS_DataReq(&messageParams); до того как подтверждение от прошлого не пришло.

В большинстве случаев подтверждение приходит быстро, но если кадры теряются, то оно может занять до 30-40 секунд.
Go to the top of the page
 
+Quote Post
ZigBeeHelpMe
сообщение Sep 9 2014, 04:27
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 16-10-12
Из: Урал
Пользователь №: 73 966



Цитата(Taradov Alexander @ Sep 8 2014, 17:45) *
Скорее всего вызывается APS_DataReq(&messageParams); до того как подтверждение от прошлого не пришло.

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


Спасибо, так и думал. Поставил таймаут. Тперь нужно подождать...
Go to the top of the page
 
+Quote Post
ataradov
сообщение Sep 9 2014, 04:28
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



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


Нужно не таймаут ставить, а подтверждения ждать.
Go to the top of the page
 
+Quote Post
ZigBeeHelpMe
сообщение Sep 9 2014, 08:29
Сообщение #5





Группа: Новичок
Сообщений: 8
Регистрация: 16-10-12
Из: Урал
Пользователь №: 73 966



Цитата(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();
}


Сообщение отредактировал ZigBeeHelpMe - Sep 9 2014, 08:32
Go to the top of the page
 
+Quote Post
ataradov
сообщение Sep 10 2014, 01:44
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



Не нужен тут таймер. Задержка которая происходит в стеке, произойдет до вызова APS_DataConf(). После того как APS_DataConf() вызван можно снова вызывать APS_DataReq().

Вызвали APS_DataReq(), поставили флаг, вызвался APS_DataConf(), сняли флаг. Не нудно ждать дополнительно 50 секунд.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016