Я использую qextserialport на малине Pi для связи с PanStamp (совместимым с Arduino устройством).Сигнал readyRead() QextSerialPort (QIODevice) не называется достаточно быстро
Этот PanStamp подключенный к Pi выполняет две функции:
- Послать показания некоторых сенсора каждую секунду (около 12 байт);
- Отправляйте все данные, которые он получает по беспроводной линии (около 60 байт около 6 раз в секунду).
Моя архитектура:
- Hub: PanStamp + Raspberry Pi;
- Спутник: PanStamp + несколько датчиков.
Есть две ситуации:
- Сателлит отправки wirelessy данных в Хаб. В этой ситуации Pi получает много данных через последовательный порт каждую секунду;
- Спутник выключен, Pi получает около 12 байт в секунду через последовательный порт.
Когда спутник находится вне readyRead()
сигнала не генерируется каждый раз, когда байты поступают и это сводит мою программу к «из синхронизации» состояния, где каждый пакет данных читать один или несколько остается в буфере (т.е. продолжает расти).
Однако, когда я включаю спутник, и Pi начинает получать много данных, это условие «не синхронизируется» исчезает, появляется всплеск данных (буфер растет быстрее и после его освобождения), и моя программа запускается работать «в режиме реального времени».
Вот пример вывода моей программы:. www.tiago.eti.br/storage/iSEDE.log
Как вы можете видеть в журнале байт доступно продолжает расти и передача данных каждую секунду (строка, начинающаяся с HUB:
не обрабатывается каждый второй есть отметка времени в начале). Через некоторое время происходит всплеск (спутник включен), и каждый раз обрабатывается много данных, данные спутника начинают обрабатываться (строки, начинающиеся с 8
), буфер опустели, и моя программа начинает обработку данных в настоящее время".
Итак, что я могу сделать, чтобы избежать чрезмерного роста буфера и не потерять данные? Я попытался вызвать функцию, подключенную к readyRead()
, когда буфер становится больше 100 байт, но он создал беспорядок, и я начал терять некоторые пакеты.
Пожалуйста, пост код, в частности, то, что вы написали для чтения из 'QIODevice'. –
Любая причина, по которой вы не используете QtSialialPort? – lpapp
Да, когда я впервые использовал серийный порт (несколько лет назад) с Qt QtSerialPort, не было доступно, поэтому я использовал то, что я уже знал. –