Я использую 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. журнал
Как вы можете видеть в журнале, количество доступных байтов продолжает расти, и данные отправляются каждую секунду (строка, начинающаяся с HUB:
, не обрабатывается каждую секунду. В начале есть отметка времени). Через некоторое время происходит всплеск (включен спутник) и каждую секунду обрабатывается много данных, начинают обрабатываться данные со спутника (строки, начинающиеся с 8
), буфер очищается и моя программа начинает обработку данных в реальном времени".
Итак, что я могу сделать, чтобы избежать чрезмерного роста буфера и не потерять данные? Я попытался вызвать функцию, связанную с readyRead()
, когда буфер стал больше 100 байт, но это создало беспорядок, и я начал терять некоторые пакеты.
QIODevice
. - person RA.   schedule 06.08.2013