Qt QML - QModBus číst poškozen tím, QML BusyIndicator/Animace - SingleThread

0

Otázka

Mám jeden závit QQuick aplikace s jedním hlavním oknem a jedna třída, která zpracovává Modbus Zápis/Čtení funkce. Vše je v pořádku tak daleko, ale když jsem dal BusyIndicator v mém qml okno ukázat, že Autobus je zaneprázdněn jsem dostal CRC nesouladu a odpovědi časové limity, např.:

  • "Vyřazení reakci s nesprávným CRC, obdržel: 64580 , vypočítá CRC: 55067"
  • "Přečtěte si reakci chyba: Odpověď časový limit. (kód: 0x5)" - qt.modbus: (RTU klienta) Nemohou rovnat reakci s otevřenou žádost, ignorování

Na ReadRequest je odeslána prostřednictvím

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

Pokud není animace spuštěna v okně, data je přijat bez chyb.

  • Lze to vyřešit pomocí samostatné vlákno spustit modbus čtení/zápis metody a jak bych to mohl provést? Nebo bych pouze zvýšit špatně načte tím, že Sériové funkce v samostatném Vlákně?

Jak jsem pochopil tak daleko, vzhledem k tomu, že moje aplikace je zatím běží v jednom vlákně, průběžná aktualizace GUI je nějak ruší příjem Sériových Dat.

Já jsem použil linux příkazového řádku nástroj "stres", jestli jsem ztratit data za vysoké zatížení cpu stejně, ale to není tento případ.

Druh jde

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

Nejlepší odpověď

1

Našel jsem problém:

Jako myslel jsem, že qml engine, graf scény, nebo jak tomu říkáte, způsobené minul rámy modbus recepci. Myslím, že nějak threading možná pomohlo to, ale nebyl jsem schopen to opravit tím, že má modbusInterface běžet v samostatném vlákně.

Nakonec řešení bylo umožnit závitem vykreslení smyčky grafu scény, jak je uvedeno zde: https://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html#threaded-render-loop-threaded

I. e. tím, že

qputenv("QSG_RENDER_LOOP","threaded");

v mém main().

2021-10-28 12:49:29

V jiných jazycích

Tato stránka je v jiných jazycích

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