diff options
Diffstat (limited to 'src/serialbus/qmodbusrtuserialslave.cpp')
-rw-r--r-- | src/serialbus/qmodbusrtuserialslave.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/src/serialbus/qmodbusrtuserialslave.cpp b/src/serialbus/qmodbusrtuserialslave.cpp index 41f3215..718d739 100644 --- a/src/serialbus/qmodbusrtuserialslave.cpp +++ b/src/serialbus/qmodbusrtuserialslave.cpp @@ -107,9 +107,8 @@ bool QModbusRtuSerialSlave::open() return true; Q_D(QModbusRtuSerialSlave); - d->updateSerialPortConnectionInfo(); if (d->m_serialPort->open(QIODevice::ReadWrite)) { - d->m_serialPort->clear(); + d->setupEnvironment(); setState(QModbusDevice::ConnectedState); } else { setError(d->m_serialPort->errorString(), QModbusDevice::ConnectionError); @@ -126,13 +125,38 @@ void QModbusRtuSerialSlave::close() return; Q_D(QModbusRtuSerialSlave); - if (d->m_serialPort->isOpen()) d->m_serialPort->close(); setState(QModbusDevice::UnconnectedState); } +/*! + \reimp + + Processes the Modbus client request specified by \a request and returns a + Modbus response. + + The Modbus function \l QModbusRequest::EncapsulatedInterfaceTransport with + MEI Type 13 (0x0D) CANopen General Reference is filtered out because it is + usually Modbus TCP or Modbus serial ASCII only. + + A request to the RTU serial slave will be answered with a Modbus exception + response with the exception code QModbusExceptionResponse::IllegalFunction. +*/ +QModbusResponse QModbusRtuSerialSlave::processRequest(const QModbusPdu &request) +{ + if (request.functionCode() == QModbusRequest::EncapsulatedInterfaceTransport) { + quint8 meiType; + request.decodeData(&meiType); + if (meiType == EncapsulatedInterfaceTransport::CanOpenGeneralReference) { + return QModbusExceptionResponse(request.functionCode(), + QModbusExceptionResponse::IllegalFunction); + } + } + return QModbusServer::processRequest(request); +} + #include "moc_qmodbusrtuserialslave.cpp" QT_END_NAMESPACE |