Qt QML - QModBus citit corupt de QML BusyIndicator/Animație - SingleThread

0

Problema

Am un singur fir QQuick aplicație cu o singură fereastră principală și o clasă care se ocupă de Modbus Scrie/Citi funcții. Totul este de lucru bine până acum, dar cand am pus-o BusyIndicator în qml fereastră pentru a arăta că Autobuzul este aglomerat ajung CRC neconcordanțele și de reacție timeout-uri, de exemplu:

  • "Aruncarea răspuns greșit cu CRC, primit: 64580 , calculează CRC: 55067"
  • "Citește-răspuns de eroare: Răspuns timeout. (cod: 0x5)" - qt.modbus: (RTU client) nu se Poate compara răspuns cu cererea deschisă, ignorând

La ReadRequest este trimis prin

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

Dacă nu există nici o animație care rulează în fereastră, de date este recepționat fără erori.

  • Acest lucru poate fi reparat folosind un fir separat pentru a rula modbus citire/scriere metode și cum mi-ar implementa asta? Sau ar crește doar misreads prin punerea Serie de funcții într-un Thread separat?

După cum am înțeles până acum, datorită faptului că cererea mea este atât de departe execută într-un singur fir, actualizarea continuă a GUI este într-un fel interferează cu recepția de Date Seriale.

Am folosit linux command line tool "stres" pentru a vedea dacă am pierde date sub procesorului de sarcină la fel de bine, dar nu e cazul.

Kind ceea ce privește

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

Cel mai bun răspuns

1

Am gasit problema:

Cum am crezut că qml motor de randare, scena grafic sau orice ai spune, cauzate ratat cadre modbus recepție. Cred threading-ar fi ajutat cu asta, dar nu am fost capabil să-l repara prin a avea modbusInterface rula într-un thread separat.

În final, soluția a fost de a permite filetate face bucla de scena grafic după cum se menționează aici: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

I. e. prin punerea

qputenv("QSG_RENDER_LOOP","threaded");

în main().

2021-10-28 12:49:29

În alte limbi

Această pagină este în alte limbi

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