Я использую qextserialport на Raspberry Pi для связи с PanStamp (Arduino-совместимым устройством).
Этот PanStamp, подключенный к Pi, выполняет две функции:
Моя архитектура это:
Есть две ситуации:
Когда спутник выключен readyRead()
Сигнал не генерируется каждый раз, когда поступает байт, и он приводит мою программу в состояние «несинхронизировано», когда каждый прочитанный пакет данных остается в буфере (который продолжает расти).
Однако, когда я включаю спутник, и Pi начинает получать много данных, это условие «несинхронизации» исчезает, происходит выброс данных (буфер растет быстрее и после очистки), и моя программа начинает работать «в в режиме реального времени «.
Вот пример вывода моей программы: www.tiago.eti.br/storage/iSEDE.log
Как вы видите в журнале, количество доступных байтов растет, а данные отправляются каждую секунду (строка начинается с HUB:
не обрабатывается каждую секунду. в начале есть отметка времени). Через некоторое время происходит всплеск (спутник включен), и каждую секунду обрабатывается большое количество данных, данные спутника начинают обрабатываться (строки начинаются с 8
), буфер очищается, и моя программа начинает обрабатывать данные в «реальном времени».
Итак, что я могу сделать, чтобы избежать слишком большого роста буфера и не потерять данные?
Я пытался вызвать функцию, которая связана с readyRead()
когда буфер становится больше, чем 100 байтов, но это создает беспорядок, и я начал терять некоторые пакеты.
Ваша проблема в наиболее распространенной ошибке, которую люди делают с QIODevice. Вы ошибочно полагаете, что readyRead вызывается для каждого байта, говоря больше, если будет работать так, это будет совершенно неправильно. Идея в том, что каждый раз, когда вы получаете готовый ЧТО-ТО читать с устройства … это может быть 1 байт, 10 байт, 1 Кб … и т. д. Проще говоря, это сделано так, чтобы минимизировать загрузку ЦП в случае передачи блоков, а также на аппаратном уровне для чтения данных в блоках, а не затем в байтах.
Поэтому вам нужно вызвать readAll (), чтобы получить все доступные данные и обработать их так, как вам нравится.
Вы можете посмотреть в Вот..
Других решений пока нет …