Qt QML - QModBus leer dañado por QML BusyIndicator/Animación - SingleThread

0

Pregunta

Tengo un solo hilo QQuick aplicación con una ventana principal y una clase que se encarga de Modbus Lectura/Escritura de funciones. Todo funciona bien hasta ahora, pero cuando pongo un BusyIndicator en mi qml ventana para mostrar que el Bus está ocupado puedo obtener diferencias CRC de respuesta y los tiempos de espera, por ejemplo:

  • "Desechando la respuesta con mal CRC, recibido: 64580 , calcula el CRC: 55067"
  • "Leer la respuesta de error: timeout de Respuesta. (código: 0x5)" - qt.modbus: (RTU cliente) No coincide con la respuesta con la solicitud de apertura, ignorando

El ReadRequest se envía a través de

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();
}

Si no hay ninguna animación se ejecuta en mi ventana, se reciben los datos sin errores.

  • Esto puede ser corregido mediante el uso de un subproceso independiente para ejecutar el modbus lectura/escritura de métodos y cómo puedo implementar? O solo me aumento la lectura poniendo la Serie de funciones en un Hilo separado?

Como yo lo entiendo hasta el momento, debido al hecho de que mi solicitud es hasta el momento que se ejecuta en un solo hilo, la continua actualización de la interfaz de usuario es de alguna manera interferir con la recepción de Datos en Serie.

He utilizado la línea de comandos de linux herramienta de "estrés" a ver si puedo perder los datos bajo alta carga de cpu así, pero ese no es el caso.

Saludos

c++ modbus multithreading qml
2021-10-27 11:45:23
1

Mejor respuesta

1

He encontrado el problema:

Como pensé que el qml motor de renderizado, escena gráfico o como se la quiera llamar, causado perdidas marcos de modbus recepción. Supongo que de alguna manera roscado podría haber ayudado con eso, pero yo no era capaz de solucionarlo por tener la modbusInterface ejecuta en un hilo separado.

Al final, la solución era permitir que el subproceso de procesamiento de bucle de la escena gráfica como se indica aquí: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

I. e. por poner

qputenv("QSG_RENDER_LOOP","threaded");

en mi main().

2021-10-28 12:49:29

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................