ฉันมีนัดเดียวด้าย QQuick องโปรแกรมกับหน้าต่างหลักและหนึ่งในชั้นเรียนและจัด Modbus เขียน/อ่านฟังก์ชัน. ทุกอย่างกำลังทำงานสบายดีตอนนี้แต่เมื่อฉันใส่ BusyIndicator ในของฉัน qml หน้าต่างเพื่อแสดงให้เห็นว่ารถบัสกำลังยุ่งฉันได้ค่า crccompression method mismatches และการตอบสนอ timeouts,e.g.:
- "Discarding การตอบสนองกับผิดค่า crccompression method ได้รับ:64580,คำนวณค่า crccompression method:55067"
- "อ่านการตอบสนอผิดพลาด:การตอบสนหมดเวลา. (รหัส:0x5)"-qt.modbus:(RTU ลูกค้าของ)ไม่สามารถตรงกับการตอบสนอนกับเปิดการร้องขอ,ไม่สนใจ
ที่ ReadRequest คือส่งผ่านทาง
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();
}
ถ้าไม่มีการกระตุ้นการทำงานกำลังอยู่ในหน้าต่างข้อมูลคืนได้รับโดยไม่มีข้อผิดพลาด.
- นี่มันสามารถแก้ไขโดยใช้แยกกันเธรดที่ modbus รอ่าน/เขียนวิธีการของแล้วทำไมฉันจะต้องด้วยอะไรซักอย่างนั้น? หรือฉันแค่เพิ่ม misreads นด้วยการต่อเนื่องฟังก์ชันแยกเป็นเธรด?
อย่างที่ฉันเข้าใจว่ามันถึงตอนนี้เนื่องจากความจริงที่ว่าของโปรแกรมตอนนี้วิ่งด้วยการโดดครั้งเดียวด้ายปแบบโทนต่อเนื่องปรับปรุงของส่วนติดต่อผู้ใช้แบบคือบางอย่างวุ่นวายกับแผนกต้อนรับขอต่อเนื่องข้อมูล
ฉันใช้ระบบลินุกซ์บรรทัดคำสั่งเครื่องมือ"ความเครียด"เพื่อดูว่าฉันต้องสูญเสียข้อมูลภายใต้สูงหน่วยประมวลผลเรียกเช่นกันแต่นั่นไม่ใช่คดีนี้
แบบฝากฝัง