summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qmodbusrtuserialslave.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialbus/qmodbusrtuserialslave.cpp')
-rw-r--r--src/serialbus/qmodbusrtuserialslave.cpp30
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