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