QSerialPort непрерывного чтения накопительной задержки - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь установить связь из приложения QT в Arduino. Процесс выглядит следующим образом: приложение QT отправляет «1», и ожидается, что Arduino ответит некоторыми данными (длина строки данных огромна, около 300). Приложение QT отправляет «1» с частотой около 5 Гц (каждые 200 мс).

Проблема, с которой я сталкиваюсь, заключается в накопительной задержке между обменом данными между Arduino и QT. То есть данные, которые я получаю от Arduino, не являются недавними данными, но частота прихода данных Arduino составляет всего 5 Гц (что и ожидалось), только приход данных не является недавним. Эта задержка увеличивается со временем. Я считаю, что есть какая-то проблема с буфером или чем-то еще.

Что я пробовал:

QSerialPort serialPort; - это порт моего устройства

  1. serialPort.clear()
  2. serialPort.flush()
  3. Увеличение и уменьшение скорости передачи данных с обоих концов.
  4. Уменьшите длину символа в Arduino, здесь задержка значительно уменьшается, но накопленная задержка наблюдается через долгое время.

для очистки буфера последовательной связи, но проблема все еще сохраняется.

Вот мой фрагмент кода:

connect(timer_getdat, SIGNAL(timeout()), this, SLOT(Rec()));
        timer_getdat->start(200); 

, где Rec() - функция, в которой я выполняю коммуникационную часть.

В Rec():

serialPort.write("1", 2);
//            serialPort.waitForBytesWritten(100);

long long bytes_available = serialPort.bytesAvailable();

if (bytes_available >= 1)
{
            serialPort.readLine(temp, 500);
            serialPort.flush(); // no change
            serialPort.clear(); // no change by .clear() also
}

Я застрял в этом вопросе довольно долго. Приведенный выше фрагмент кода - это то, что я считаю необходимым, но если кому-то понадобится больше разъяснений, я могу раскрыть больше кода.

1 Ответ

1 голос
/ 07 ноября 2019

Я тоже сталкивался с той же проблемой, и да QSerialPort.clear() и QSerialPort.flush() не помогают. Попробуйте сделать readAll()

Поэтому измените часть в вашей функции Rec () на что-то вроде этого:

serialPort.write("1", 2);
long long bytes_available = serialPort.bytesAvailable();

if (bytes_available >= 1)
{
            serialPort.readLine(temp, 500);
            serialPort.readAll(); // This reads all the data in buffer at once and clears the queue.
}

Даже на форумах QT я не нашел ответа на этот вопрос,играл со всеми функциями, доступными в классе QSerialPort, и readAll (), кажется, работает.

О readAll(), документация Qt гласит:

Считывает все оставшиеся данные с устройства, ивозвращает его в виде байтового массива.

Мое объяснение этого разрешения состоит в том, что readAll захватывает все данные из буфера связи и очищает его.

Это должно быть заданием clear() функция, но, видимо, readAll(), кажется, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...