// запись данных serial.write(dataRequest); // ожидание записи в порт if (serial.waitForBytesWritten(100) == false) return false; // ожидание прихода полного кадра flag = true; *receivear = new QByteArray(); receive = *receivear; do{ // ждем ответные данные if (serial.waitForReadyRead(100) == false){ qDebug() << "fail"; return false; }; // считывание данных readData = serial.readAll(); while (serial.waitForReadyRead(10)) readData += serial.readAll(); qDebug() << "Data read: " << readData.toHex(' '); // анализ кадра if (cadrAnalysis(readData, *receive) == true) flag = false; } while (flag);
C++ (Qt)void Foo::sendDataRequest(){ ... serial->write(request); ...} void Foo::sendStatusRequest(){ ... serial->write(request); ...} void Foo::onReadyRead(){ m_packet += serial->readAll(); // Проверяем пакет. Если приняли не полный пакет - выходим. if (notFullPackage()) return; // Если пакет - есть ответ данных, то шлем запрос статуса. if (packageIsData()) { sendStatusRequest(); return; } // Если пакет - есть ответ статуса, то делаем что-то еще. if (packageIsStatus()) { doSomething(); return; } } Foo::onStartTransaction(){ sendDataRequest();}
C++ (Qt)QByteArray CSerialIface::sendSyncRequest(QByteArray &data) { CWaitLoop loop; QTimer::singleShot(responseTimeout, &loop, &CWaitLoop::quit); connect(this, &CSerialIface::responseReceived, &loop, &CWaitLoop::exitSlot); sendAsyncRequest(data); loop.exec(); return loop.response;}