2017-01-16 5 views
-2

私はそれの背後にある原則を理解していないので質問があります。リアルタイムハードウェアストリーム(Python)を読むことの理解

私は無線温度センサーからデータを受信するために、USB DVB-Tドングルからリアルタイムデータを読み取るPythonスクリプトを書いた。私は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の仕組みによって異なります。

ところで、rtl_fm出力した生のバイトを仮定して、Pythonの3では、あなたはsys.stdin.bufferからの読み取りではなく、ファイルディスクリプタとos通話をいじりでstdinからそれらのバイトを読み取ることができます。 (Python 2では、ちょうどsys.stdinからバイトを読むことができます;少なくともLinuxや、テキストストリーム上で改行をしない他のUnixライクなOSでも可能です)。

関連する問題