У меня есть однопоточное приложение QQuick с одним главным окном и одним классом, который обрабатывает функции записи/чтения Modbus. Пока все работает нормально, но когда я помещаю индикатор занятости в окно qml, чтобы показать, что шина занята, я получаю несоответствия CRC и тайм-ауты ответа, например:
- "Отклонение ответа с неправильным CRC, получено: 64580 , вычисленный CRC: 55067"
- "Ошибка чтения ответа: тайм-аут ответа. (код: 0x5)" - qt.modbus: (клиент RTU) Не удается сопоставить ответ с открытым запросом, игнорируя
Запрос на чтение отправляется через
void ModbusDevice::readData(int serveraddress, int startaddress, int cnt) {
QModbusDataUnit RxData;
if(startaddress>=HOLDING_BASE) RxData.setRegisterType(QModbusDataUnit::HoldingRegisters);
else RxData.setRegisterType(QModbusDataUnit::InputRegisters);
RxData.setStartAddress(startaddress);
RxData.setValueCount(cnt);
if (auto *reply = m_ModbusClient->sendReadRequest(RxData, serveraddress)) {
connect(reply, &QModbusReply::finished, this, &CellDevice::InterruptHandler);
else qDebug() << m_ModbusClient->errorString();
}
Если в моем окне нет анимации, данные принимаются без ошибок.
- Можно ли это исправить, используя отдельный поток для запуска методов чтения/записи modbus, и как бы я это реализовал? Или я только увеличил бы количество ошибок, поместив последовательные функции в отдельный поток?
Насколько я понимаю, из-за того, что мое приложение до сих пор работает в одном потоке, непрерывное обновление графического интерфейса каким-то образом мешает приему последовательных данных.
Я использовал инструмент командной строки Linux "стресс", чтобы проверить, не теряю ли я данные и при высокой загрузке процессора, но это не так.
С уважением