Ho un unico thread QQuick applicazione con una finestra principale e una classe che gestisce Modbus di Lettura/Scrittura di funzioni. Tutto funziona bene, ma quando ho messo un BusyIndicator nel mio qml finestra per mostrare che il Bus è occupato ho CRC incongruenze e risposta timeout, ad esempio:
- "Scartando risposta sbagliata CRC, ha ricevuto: 64580 , CRC calcolato: 55067"
- "Leggere la risposta di errore: timeout di Risposta. (codice: 0 x 5)" - qt.modbus: RTU (client) Non può corrispondere risposta con richiesta di apertura, ignorando
Il ReadRequest viene inviato via
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();
}
Se non c'è animazione in esecuzione nella mia finestra, i dati vengono ricevuti senza errori.
- Questo può essere risolto utilizzando un thread separato per eseguire il modbus lettura/scrittura metodi e come posso implementare questo? Oppure dovrei solo aumentare la interpreti erroneamente mettendo il Seriale funzioni in un Thread separato?
Da quanto ho capito finora, a causa del fatto che la mia domanda è finora l'esecuzione in un unico thread, il continuo aggiornamento della GUI è in qualche modo interferire con la ricezione di Dati Seriali.
Ho usato la riga di comando di linux strumento di "stress" per vedere se perdo i dati in alto il carico della cpu, come pure, ma non è questo il caso.
Cordiali saluti