2016-06-29 12 views
0

私はPythonでGNUradioスクリプトを書くことを実験しています。私の最終的な目標は、GNUradioプロセス内の浮動小数点結果をシリアルポートに定期的に書き込むルーチンを持つことです。単純なGNUradioフローを中断する

`#!/usr/bin/env python 
################################################## 
# Gnuradio Python Flow Graph 
# Title: simpleTone 
# Generated: Wed Jun 29 07:26:02 2016 
################################################## 

from gnuradio import analog 
from gnuradio import audio 
from gnuradio import blocks 
from gnuradio import gr 
import time 

class simpleTone(gr.top_block): 

    def __init__(self): 
    gr.top_block.__init__(self) 

     ################################################## 
     # Variables 
     ################################################## 
     self.samp_rate = samp_rate = 32000 

     ################################################## 
     # Blocks 
     ################################################## 
     self.blocks_throttle_0 = blocks.throttle(gr.sizeof_float*1, samp_rate) 
     self.audio_sink_0 = audio.sink(samp_rate, "", True) 
     self.analog_sig_source_x_0 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 1000, 1, 0) 

     ################################################## 
     # Connections 
     ################################################## 
     self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 0)) 
     self.connect((self.blocks_throttle_0, 0), (self.audio_sink_0, 0)) 


if __name__ == '__main__': 
    simpleTone().run()` 

上記のコードは、オーディオでは、いくつかのオーバーフローの例外とクリックして、正常に動作します:最初のステップとして、私は単純に次のコードは、サウンドカードを通して1kHzのトーンを再生し、単純なルーチンを一時停止したかったです。私は次の置換作る場合は:

`   
if __name__ == '__main__': 
    simpleTone().start() 
    time.sleep(3) 
    simpleTone().stop()` 

を結果は、ファイルが実行されることで、3秒後に終了しないが、何の音声は生成されません。

私はかなり基本的な何かを見逃していると確信しています、どんな助けていただければ幸いです。ありがとう。

-Ed

この質問はまた、ここで提起された
+0

スロットルを取り外します。実際のレート制限ハードウェアを搭載したフローグラフでスロットルブロックを使用することは悪い考えであるという警告が表示されるはずです。 **スロットルをハードウェアのシンクとソースと一緒に使用しないでください!** –

+0

マーカスのご提案ありがとうございます。私はスロットルを使うのはいつも「安全」だと思っていました:)スロットルブロックを取り外すと、プログラムを実行しているときにオーバーフロー/オーディオの問題が修正されました。プロセスを開始/スリープ/ストップしようとする問題は依然として残っています。 –

答えて

0

http://lists.gnu.org/archive/html/discuss-gnuradio

と答えました。 あなたは「simpleTone()」の3つの別々の出現を持っている:

あなたの問題は、次の3つの無関係なトップブロックを構築しているということです:私は誰かがこの質問に出くわす場合には、ここでその答えを共有します。代わりに使用すると、1つを作成し、そのように、それを使用し続ける必要があり :

tb = simpleTone() 
tb.start() 
... 
tb.stop() 

あなたが 最初のものを固定した後見つけなる、あまりにも、別の問題を抱えています。 .wait()はflowgraphがすべて の処理を終了するのを待つことを意味し、フローグラフにはHeadブロックなど を終了する要素がないため、.stop()には決して到達しません。

代わりに、あなたはこのように続行する必要があります。

tb = simpleTone() 
tb.start() 
# the flowgraph is now running independently 
time.sleep(3) 
tb.stop() 
tb.wait() 

最終.WAITは()このケースでは実際には必要ありません - 何それ を行うことは起こるであろう、仕上げにフローグラフを待っていますすぐに .stop()が呼び出されたが、後で同じトップ ブロックを再度開始したい場合は、.start()を呼び出す前に.wait()を呼び出す必要があります。 、stop、wait]または[start、 wait、stop]は良い習慣です。

0

これは、Pythonでオブジェクトを作成する方法に問題があります。 'simpleTone()'を呼び出すたびに、実際に新しいオブジェクトを開始しています。クラスsimpleToneの。私は、1つのオブジェクトを作成すると問題が解決されるという以前の答えに同意します。

関連する問題