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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QModbusRtuSerialMaster  (Прочитано 2726 раз)
Larry
Гость
« : Ноябрь 01, 2017, 12:34 »

Добрый день, форумчане.
Необходимо реализовать передачу/прием данный по протоколу modbus. Возникла следующая ситуация: после вызова метода disconnectDevice() постоянно висит состояние closingState и не меняется. Почему может возникнуть такая ситуация?

Код:
//------------------------------------------
void ConfiguratorWindow::connectSerialPort()
{
    if(!m_modbus || ui->cboxPortNameList->count() == 0)
        return;

    statusBar()->clearMessage();

    if(m_modbus->state() != QModbusDevice::ConnectedState)
    {
        m_modbus->setConnectionParameter(QModbusDevice::SerialPortNameParameter, ui->cboxPortNameList->currentText());
        m_modbus->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, ui->cboxBaudrateList->currentText().toInt());
        m_modbus->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, ui->cboxBitCount->currentText().toInt());

        int parity = (ui->cboxParity->currentText().toUpper() == tr("NO"))?QSerialPort::NoParity:
                     (ui->cboxParity->currentText().toUpper() == tr("EVEN"))?QSerialPort::EvenParity:
                     (ui->cboxParity->currentText().toUpper() == tr("ODD"))?QSerialPort::OddParity:
                     (ui->cboxParity->currentText().toUpper() == tr("MARK"))?QSerialPort::MarkParity:
                                                                             QSerialPort::SpaceParity;

        m_modbus->setConnectionParameter(QModbusDevice::SerialParityParameter, parity);
        m_modbus->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, ui->cboxStopBit->currentText().toInt());
        m_modbus->setTimeout(ui->sboxTimeout->value());
        m_modbus->setNumberOfRetries(ui->sboxNumRetries->value());

        if(!m_modbus->connectDevice())
        {
            statusBar()->showMessage(tr("Сбой соединения: ") + m_modbus->errorString(), 5000);
            return;
        }
    }
    else
    {
        m_modbus->disconnectDevice();
    }
}

Вот слот, который обрабатывает изменение состояния:
Код:
//-----------------------------------------------------------------
void ConfiguratorWindow::onStateChanged(QModbusDevice::State state)
{
    bool connected = (state != QModbusDevice::UnconnectedState);

    ui->pbtnConnect->setChecked(connected);

    if(state == QModbusDevice::UnconnectedState)
    {
        statusBar()->showMessage(tr("Соединение закрыто"), 5000);
        ui->pbtnConnect->setText(tr("Открыть"));
    }
    else if(state == QModbusDevice::ConnectedState)
    {
        statusBar()->showMessage(tr("Соединение открыто"), 5000);
        ui->pbtnConnect->setText(tr("Закрыть"));
    }
}

Спасибо.
« Последнее редактирование: Ноябрь 04, 2017, 09:35 от Larry » Записан
Larry
Гость
« Ответ #1 : Ноябрь 04, 2017, 09:34 »

У меня стоял Qt 5.8.0. В bug reports нашел ответ на свой вопрос Улыбающийся. До версии 5.9.0 был такой баг. Установил 5.9.2 и все работает.
https://bugreports.qt.io/browse/QTBUG-59050
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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