Сигнал readyRead () для QextSerialPort (QIODevice) вызывается недостаточно быстро

Я использую qextserialport на Raspberry Pi для связи с PanStamp (Arduino-совместимым устройством).

Этот PanStamp, подключенный к Pi, выполняет две функции:

  • Отправлять показания некоторых датчиков каждую секунду (около 12 байт);
  • Отправляйте все данные, которые он получает, по беспроводной линии связи (около 60 байтов около 6 раз в секунду).

Моя архитектура это:

  • хаб: PanStamp + Raspberry Pi;
  • спутник: PanStamp + несколько датчиков.

Есть две ситуации:

  • Спутник на отправку данных по беспроводной связи в хаб. В этой ситуации Pi получает много данных через последовательный порт каждую секунду;
  • При выключенном спутнике Pi получает около 12 байтов каждую секунду через последовательный порт.

Когда спутник выключен readyRead() Сигнал не генерируется каждый раз, когда поступает байт, и он приводит мою программу в состояние «несинхронизировано», когда каждый прочитанный пакет данных остается в буфере (который продолжает расти).

Однако, когда я включаю спутник, и Pi начинает получать много данных, это условие «несинхронизации» исчезает, происходит выброс данных (буфер растет быстрее и после очистки), и моя программа начинает работать «в в режиме реального времени «.

Вот пример вывода моей программы: www.tiago.eti.br/storage/iSEDE.log

Как вы видите в журнале, количество доступных байтов растет, а данные отправляются каждую секунду (строка начинается с HUB: не обрабатывается каждую секунду. в начале есть отметка времени). Через некоторое время происходит всплеск (спутник включен), и каждую секунду обрабатывается большое количество данных, данные спутника начинают обрабатываться (строки начинаются с 8), буфер очищается, и моя программа начинает обрабатывать данные в «реальном времени».

Итак, что я могу сделать, чтобы избежать слишком большого роста буфера и не потерять данные?
Я пытался вызвать функцию, которая связана с readyRead() когда буфер становится больше, чем 100 байтов, но это создает беспорядок, и я начал терять некоторые пакеты.

2

Решение

Ваша проблема в наиболее распространенной ошибке, которую люди делают с QIODevice. Вы ошибочно полагаете, что readyRead вызывается для каждого байта, говоря больше, если будет работать так, это будет совершенно неправильно. Идея в том, что каждый раз, когда вы получаете готовый ЧТО-ТО читать с устройства … это может быть 1 байт, 10 байт, 1 Кб … и т. д. Проще говоря, это сделано так, чтобы минимизировать загрузку ЦП в случае передачи блоков, а также на аппаратном уровне для чтения данных в блоках, а не затем в байтах.

Поэтому вам нужно вызвать readAll (), чтобы получить все доступные данные и обработать их так, как вам нравится.

Вы можете посмотреть в Вот..

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]