C++ (Qt) while(ack==false) {//ERROR !!! Sleep(1); //QApplication::processEvents(); }
C++ (Qt)void Foo::Foo(){ // шлем запросы по таймеру connect(timer, &QTimer::timeout, [this]() { const QByteArray request1 = ....; serial->write(request1); }); // шлем запросы по кнопке 1 connect(button1, &QPushButton::clicked, [this]() { const QByteArray request2 = ....; serial->write(request2); }); // шлем запросы по кнопке N connect(buttonN, &QPushButton::clicked, [this]() { const QByteArray requestN = ....; serial->write(requestN2); }); // парсим ответы connect(serial, &QSerialPort::readyRead, [this]() { // парсим входной непрерывный стрим из порта и разбираем его на ответы for (;;) { const qint64 available = serial->bytesAvailable(); if (available < expected) return; // данных недостаточно, выходим до следующего readyRead. enum { StartByteIndex = ..., StopByteIndex = ..., }; enum { StartByte = 0xAA, StopByte = 0x55, }; const QByteArray peeked = serial->peek(expected); // считываем копию пакета и пытаемся его проверить // проверяем стартовый байт / поле заголовка (если есть) if (peeked.at(StartByteIndex) != StartByte) { dropBytes(1); // убираем навсегда первый символ из буфера порта, пытаемся снова синхронизироваться continue; } // проверяем стоповый байт / поле хвоста (если есть) if (peeked.at(StopByteIndex) != StopByte) { dropBytes(1); // убираем навсегда первый символ из буфера порта, пытаемся снова синхронизироваться continue; } // проверяем поле длины (если есть) if (peeked.at(LengthIndex) != Length) { dropBytes(1); // убираем навсегда первый символ из буфера порта, пытаемся снова синхронизироваться continue; } // проверяем CRC (если есть) if (peeked.at(CrcIndex) != CRC) { dropBytes(1); // убираем навсегда первый символ из буфера порта, пытаемся снова синхронизироваться continue; } // все OK, пакет годный.. dropBytes(expected); // убираем весь пакет из буфера порта навсегда, он не нужен, т.к. у нас есть копия peeked // извлекаем тело с данными из peeked // чо-то с делаем с телом, обновляем UI и прочее вещи.. } });} void Foo::dropBytes(qint64 bytesCount){ serial->read(bytesCount); // dummy read}
C++ (Qt)while(ack==false) { Sleep(1); }ack=false;//Запускаем таймер таймаута//Тут читаем данные с портаwhile(Не все прочитали) { QApplication::processEvents(); }//Тут мы все прочитали или сработал таймерack=true;return