--- a/qtserialbus/src/serialbus/qmodbusrtuserialmaster_p.h.orig Tue Aug 09 12:17:42 2016 +++ b/qtserialbus/src/serialbus/qmodbusrtuserialmaster_p.h Tue Aug 09 12:09:53 2016 @@ -80,9 +80,6 @@ { Q_Q(QModbusRtuSerialMaster); - m_sendTimer.setSingleShot(true); - QObject::connect(&m_sendTimer, &QTimer::timeout, q, [this]() { processQueue(); }); - m_responseTimer.setSingleShot(true); QObject::connect(&m_responseTimer, &QTimer::timeout, q, [this]() { processQueue(); }); @@ -151,7 +148,6 @@ return; } - m_sendTimer.stop(); m_responseTimer.stop(); processQueueElement(response, m_current); @@ -208,17 +204,20 @@ qCDebug(QT_MODBUS) << "(RTU server) Unhandled QSerialPort error" << error; break; } + if (m_state == Send) + processQueue(); }); QObject::connect(m_serialPort, &QSerialPort::bytesWritten, q, [this](qint64 bytes) { m_current.bytesWritten += bytes; + if (m_current.bytesWritten >= m_current.adu.size()) + processQueue(); }); QObject::connect(m_serialPort, &QSerialPort::aboutToClose, q, [this]() { Q_Q(QModbusRtuSerialMaster); if (q->state() != QModbusDevice::ClosingState) q->close(); - m_sendTimer.stop(); m_responseTimer.stop(); }); } @@ -283,7 +282,6 @@ void processQueue() { - Q_ASSERT_X(!m_sendTimer.isActive(), "processQueue", "send timer active"); Q_ASSERT_X(!m_responseTimer.isActive(), "processQueue", "response timer active"); auto writeAdu = [this]() { @@ -291,9 +289,6 @@ m_current.bytesWritten = 0; m_current.numberOfRetries--; m_serialPort->write(m_current.adu); - // Example: 9600 baud, 11 bit per packet -> 872 char/sec - // so: 1000 ms / 872 char = 1.147 ms/char * 3.5 character - m_sendTimer.start((1000. / (qreal(m_baudRate) / 11.)) * m_current.adu.size()); qCDebug(QT_MODBUS) << "(RTU client) Sent Serial PDU:" << m_current.requestPdu; qCDebug(QT_MODBUS_LOW).noquote() << "(RTU client) Sent Serial ADU: 0x" + m_current.adu @@ -383,7 +378,6 @@ return false; } - QTimer m_sendTimer; QTimer m_responseTimer; QueueElement m_current;