crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> [РЕШЕНО]QModbusRtuSerialMaster
larry
  опции профиля:
сообщение 2.11.2017, 9:28
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


Добрый день, форумчане.
Необходимо реализовать передачу/прием данный по протоколу 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("Закрыть"));
   }
}


Спасибо.

Сообщение отредактировал larry - 4.11.2017, 9:40
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
larry
  опции профиля:
сообщение 4.11.2017, 9:39
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 55
Регистрация: 16.12.2010
Пользователь №: 2274

Спасибо сказали: 8 раз(а)




Репутация:   0  


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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 28.3.2024, 22:47