Russian Qt Forum
Декабрь 16, 2018, 17:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Не срабатывает timeout QTimer  (Прочитано 875 раз)
Larry
Программист
*****
Offline Offline

Сообщений: 556



Просмотр профиля
« : Март 04, 2018, 19:57 »

Добрый день, форумчане.
Возник вопрос. К com-порту подключено устройство, которое опрашивается через определенный промежуток времени. Необходим механизм разъединения в случае, если устройство не отвечает. При отправке сообщения запускаю таймер, а при получении ответа отключаю. Кроме того, если не было ответа необходимо продублировать запрос (количество попыток настраивается). По умолчанию количество попыток 3 и встретился с тем, что таймер два раза отрабатывает, а третий уже нет и получается, что сообщения сыпятся в порт постоянно, а ответа нет (возможно выставили некорректно скорость, либо устройство зависло).
слот обработки таймаута сделал следующим образом:
Код:
void CModbus::timeout()
{
    m_timeout_timer->stop();
    
    m_counter_request_error++; // количесто запросов без ответа
    m_receive_buffer.clear();
    
    if(m_counter_request_error == m_request_count_repeat)
    {
        disconnectDevice();
    }
    else
    {
        request(m_request_cur);
    }
}

Т.е. если запрос остался без ответа 3 раза, то отключаемся от порта. Иначе повторяем текущий запрос...почему таймер не отрабатывает третий раз? Где может подвисать?
Спасибо.
« Последнее редактирование: Март 04, 2018, 21:39 от Larry » Записан
vic57
Чайник
*
Offline Offline

Сообщений: 77


Просмотр профиля
« Ответ #1 : Март 04, 2018, 21:37 »

Код:
void CModbus::timeout()
{
    m_timeout_timer->stop();//а где timer->start()?
   
    m_counter_request_error++; // количесто запросов без ответа //где обнуляется счетчик?
    m_receive_buffer.clear();
   
    if(m_counter_request_error == m_request_count_repeat)
    {
        disconnectDevice();
    }
    else
    {
        request(m_request_cur);
    }
}
Записан
Larry
Программист
*****
Offline Offline

Сообщений: 556



Просмотр профиля
« Ответ #2 : Март 04, 2018, 21:42 »

старт был при отправке сообщения. Выяснил, что такие проблемы возникали только при подключенном таймере синхронизации (когда синхронизация работала, тогда и возникал такой вариант). Переписал логику синхронизации и все стабильно заработало.
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.042 секунд. Запросов: 22.