2017-01-16 2 views
-2

У меня вопрос, потому что я не понимаю принцип, лежащий в его основе.Понимание чтения аппаратных потоков реального времени (python)

Я написал сценарий python, который считывает данные в реальном времени с USB-DVB-T Dongle, чтобы получать данные от беспроводного датчика температуры. Я использую программу под названием rtl_fm. Это считывает данные из ключа и передает его в мой скрипт. Я написал сценарий, ища примеры, которые были не слишком сложными.

В этом скрипте я использую sys.stdin.fileno() для постоянного чтения 512 байт из входного потока. Теперь, что я не делаю, почему это работает? Если ключ, например, входной поток, будет передавать данные с более высокой скоростью, то скорость, которую мой скрипт читает, я бы либо потерял данные, либо какой-то буфер в конечном итоге переполнился. Если скорость будет медленнее, мой скрипт остановится в один момент, потому что данных больше нет.

Может кто-нибудь объяснить, как/почему это работает?

Thx.

+1

Как вы используете 'sys.stdin.fileno()' для чтения данных? Эта функция возвращает только дескриптор файла, в данном случае - '0'. Вы должны использовать 'sys.stdin.read (512)'. –

+0

Я подключаю его к скрипту python: rtl_fm parametery | python script.py - – Pythoneer

ответ

0

Управление трубой OS делает буферизацию для вас. Если вы читаете слишком быстро, ваше чтение будет заблокировано. И если rtl_fm пишет слишком быстро, запись будет блокироваться. Независимо от того, теряет ли данные, зависит от того, как работает rtl_fm.

BTW, предполагая rtl_fm выводит исходные байты, в Python 3, вы можете читать эти байты из stdin путем чтения из sys.stdin.buffer, а не возиться с дескриптором файла и os вызовов. (В Python 2 вы можете просто читать байты от sys.stdin; по крайней мере, вы можете использовать Linux и другие Unix-подобные ОС, которые не выполняют переводы новой строки в текстовых потоках).

Смежные вопросы