Hi @Chai18 Did you find any solution ? I have a similar issue but in the client side (QModbusClient) , this is my function to write data to the holding registers , but I'm all the time getting the response timeout, and master is actually handling incoming requests and send appropriate responses automatically.
void Serial::writeData(int start, const QList<quint16> &holdingRegisters) {
if (!modbusDevice)
return;
startAddress = start;
numberOfEntries = holdingRegisters.size();
// Switch to Transmit Mode
switchGPIO->setValue(true); // enables TX
QModbusDataUnit writeUnit = writeRequest();
QModbusDataUnit::RegisterType table = writeUnit.registerType();
for (qsizetype i = 0, total = writeUnit.valueCount(); i < total; ++i) {
const auto addr = i + writeUnit.startAddress();
if (table == QModbusDataUnit::Coils)
writeUnit.setValue(i, m_coils[addr]);
else
writeUnit.setValue(i, holdingRegisters[addr]);
}
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, serverAddress)) {
if (!reply->isFinished()) {
QModbusDevice::connect(
reply, &QModbusReply::finished, this, [this, reply]() {
// Switch back to Receive Mode
usleep(1000); // Small delay before switching
switchGPIO->setValue(false); // Enable RX mode
const auto error = reply->error();
if (error == QModbusDevice::ProtocolError) {
qDebug() << "Write response error:" << reply->errorString()
<< "(Modbus exception:"
<< reply->rawResult().exceptionCode() << ")";
} else if (error != QModbusDevice::NoError) {
qDebug() << "Write response error:" << reply->errorString()
<< "(code: 0x" << QString::number(error, 16) << ")";
}
reply->deleteLater();
});
} else {
qDebug() << "Write error: " << reply->errorString();
reply->deleteLater();
}
} else {
qDebug() << "Write error: " << modbusDevice->errorString();
switchGPIO->setValue(false); // Ensure RX mode is enabled on failure
}
}
Thanks in advance