Äîáðûé äåíü, ôîðóì÷àíå.
Íåîáõîäèìî ðåàëèçîâàòü ïåðåäà÷ó/ïðèåì äàííûé ïî ïðîòîêîëó 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("Çàêðûòü"));
}
}
Ó ìåíÿ ñòîÿë Qt 5.8.0. Â bug reports íàøåë îòâåò íà ñâîé âîïðîñ . Äî âåðñèè 5.9.0 áûë òàêîé áàã. Óñòàíîâèë 5.9.2 è âñå ðàáîòàåò.
https://bugreports.qt.io/browse/QTBUG-59050
Ôîðóì Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)