summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qmodbusrtuserialslave_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialbus/qmodbusrtuserialslave_p.h')
-rw-r--r--src/serialbus/qmodbusrtuserialslave_p.h21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/serialbus/qmodbusrtuserialslave_p.h b/src/serialbus/qmodbusrtuserialslave_p.h
index 96f3db4..213572c 100644
--- a/src/serialbus/qmodbusrtuserialslave_p.h
+++ b/src/serialbus/qmodbusrtuserialslave_p.h
@@ -37,6 +37,7 @@
#ifndef QMODBUSRTUSERIALSLAVE_P_H
#define QMODBUSRTUSERIALSLAVE_P_H
+#include <QtCore/qbytearray.h>
#include <QtCore/qdebug.h>
#include <QtCore/qloggingcategory.h>
#include <QtSerialBus/qmodbusrtuserialslave.h>
@@ -72,10 +73,10 @@ public:
m_serialPort = new QSerialPort(q);
QObject::connect(m_serialPort, &QSerialPort::readyRead, [this]() {
- Q_Q(QModbusRtuSerialSlave);
-
const int size = m_serialPort->size();
- const QModbusSerialAdu adu(QModbusSerialAdu::Rtu, m_serialPort->read(size));
+ m_requestBuffer += m_serialPort->read(size);
+
+ const QModbusSerialAdu adu(QModbusSerialAdu::Rtu, m_requestBuffer);
qCDebug(QT_MODBUS_LOW) << "(RTU server) Received ADU:" << adu.rawData().toHex();
// Index -> description
@@ -83,7 +84,7 @@ public:
// FunctionCode -> 1 byte
// FunctionCode specific content -> 0-252 bytes
// CRC -> 2 bytes
-
+ Q_Q(QModbusRtuSerialSlave);
QModbusCommEvent event = QModbusCommEvent::ReceiveEvent;
if (q->value(QModbusServer::ListenOnlyMode).toBool())
event |= QModbusCommEvent::ReceiveFlag::CurrentlyInListenOnlyMode;
@@ -120,6 +121,10 @@ public:
return;
}
+ // We received the full message, including checksum. We do not expect more bytes to
+ // arrive, so clear the buffer. All new bytes are considered part of the next message.
+ m_requestBuffer.resize(0);
+
if (!adu.matchingChecksum()) {
qCWarning(QT_MODBUS) << "(RTU server) Discarding request with wrong CRC, received:"
<< adu.checksum<quint16>() << ", calculated CRC:"
@@ -316,18 +321,22 @@ public:
});
}
- void updateSerialPortConnectionInfo() {
+ void setupEnvironment() {
if (m_serialPort) {
+ m_serialPort->clear();
m_serialPort->setPortName(m_comPort);
m_serialPort->setParity(m_parity);
m_serialPort->setBaudRate(m_baudRate);
m_serialPort->setDataBits(m_dataBits);
m_serialPort->setStopBits(m_stopBits);
}
+
+ m_requestBuffer.clear();
}
- QSerialPort *m_serialPort;
+ QByteArray m_requestBuffer;;
bool m_processesBroadcast = false;
+ QSerialPort *m_serialPort = nullptr;
};
QT_END_NAMESPACE