官方给的demo中:
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, ui->serverEdit->value())) {
if (!reply->isFinished()) {
connect(reply, &QModbusReply::finished, this, [this, reply]() {
if (reply->error() == QModbusDevice::ProtocolError) {
statusBar()->showMessage(tr("Write response error: %1 (Mobus exception: 0x%2)")
.arg(reply->errorString()).arg(reply->rawResult().exceptionCode(), -1, 16),
5000);
} else if (reply->error() != QModbusDevice::NoError) {
statusBar()->showMessage(tr("Write response error: %1 (code: 0x%2)").
arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
}
statusBar()->showMessage(tr("OK!"));
reply->deleteLater();
});
} else {
// broadcast replies return immediately
reply->deleteLater();
}
} else {
statusBar()->showMessage(tr("Write error: ") + modbusDevice->errorString(), 5000);
}
发送一次后,通过串口监视工具,发现有多组响应:
通过分析,可能是超时时间设置的问题,对于Modbus RTU 而言,默认超时时间是1s,所以我们可以设置大一点的超时时间:
modbusDevice->setTimeout(3000);
还有就是设置了重复询问次数的问题,ModbusRTU默认重复发送3次,屏蔽掉 setNumberOfRetries(3);
//modbusDevice->setNumberOfRetries(3);
设置完成后,问题没有再出现