2013-08-06 6 views
2

Я использую 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 байт, но он создал беспорядок, и я начал терять некоторые пакеты.

+0

Пожалуйста, пост код, в частности, то, что вы написали для чтения из 'QIODevice'. –

+0

Любая причина, по которой вы не используете QtSialialPort? – lpapp

+0

Да, когда я впервые использовал серийный порт (несколько лет назад) с Qt QtSerialPort, не было доступно, поэтому я использовал то, что я уже знал. –

ответ

4

Ваша проблема в большинстве распространенных ошибок, которые люди совершают с QIODevice. Вы ошибочно полагаете, что readyRead вызывается на каждый байт, говоря, что было бы совершенно неправильно, если бы он работал так. Идея заключается в том, что каждый раз, когда вы получаете readyRead, есть SOMETHING, чтобы читать с устройства. Это может быть 1 байт, 10 байт, 1k .. и т. Д. Простыми словами это делается так, чтобы минимизировать загрузку ЦП в случае блок-передачи, а также аппаратное обеспечение для чтения данных в блоках, а не в байтах.

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

вы можете захотеть взглянуть на here ..