Russian Qt Forum

Qt => Общие вопросы => Тема начата: Larry от Март 04, 2018, 19:57



Название: [РЕШЕНО]Не срабатывает timeout QTimer
Отправлено: Larry от Март 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 раза, то отключаемся от порта. Иначе повторяем текущий запрос...почему таймер не отрабатывает третий раз? Где может подвисать?
Спасибо.


Название: Re: Не срабатывает timeout QTimer
Отправлено: vic57 от Март 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);
    }
}


Название: Re: [РЕШЕНО]Не срабатывает timeout QTimer
Отправлено: Larry от Март 04, 2018, 21:42
старт был при отправке сообщения. Выяснил, что такие проблемы возникали только при подключенном таймере синхронизации (когда синхронизация работала, тогда и возникал такой вариант). Переписал логику синхронизации и все стабильно заработало.
Спасибо.