У меня трудности с использованием QModbusRtuSerialMaster для чтения / записи данных с устройства Modbus. Ошибка происходит, когда мое приложение пытается отправить данные на устройство:
Debug: (RTU client) Sent Serial PDU: 0x0304160001 ((null):0, (null))
Debug: (RTU client) Sent Serial ADU: 0x01030416000164fe ((null):0, (null))
Debug: (RTU client) Send failed: 0x0304160001 ((null):0, (null))
Ошибка отправки, а затем весь тайм-аут запроса. Вот некоторый код:
_modbus = new QModbusRtuSerialMaster(this);
connect(_modbus, &QModbusClient::stateChanged, this, &ModbusMaster::stateChanged);
connect(_modbus, &QModbusClient::errorOccurred, this, &ModbusMaster::errorOccurred);
_modbus->setConnectionParameter(QModbusDevice::SerialPortNameParameter, _port);
_modbus->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::EvenParity);
_modbus->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud19200);
_modbus->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
_modbus->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);
_modbus->setTimeout(1000);
_modbus->setNumberOfRetries(0);
bool ModbusMaster::read(QModbusDataUnit::RegisterType type, int startAddress, quint16 count)
{
if (!_modbus) return false;
if (_modbus->state() != QModbusDevice::ConnectedState) return false;
QModbusDataUnit req(type, startAddress, count);
if (auto *reply = _modbus->sendReadRequest(req, _id))
{
qDebug() << reply->isFinished() << _modbus->timeout();
if (!reply->isFinished()) connect(reply, &QModbusReply::finished, this, &ModbusMaster::readReady);
else readReady();
return true;
}
else
{
qDebug() << _modbus->errorString();
}
return false;
}
Я использую Qt5.11 в пользовательском дистрибутиве Yocto ARM. Что может вызвать такой сбой?
При использовании другого приложения устройство Modbus отвечает правильно.