有没有一种方法可以通过run()函数重新运行top_block?

时间:2019-05-22 20:09:32

标签: gnuradio

我已经设置了python代码以通过NBFM传输wav文件,它非常适合一次发送文件,或者如果我设置了自动重复,它将继续发送消息。但是,我想调用top_block.run()函数,等待而不是再次调用它,并且每次它将运行流程图(top_block)。

当前我有

    self.samp_rate = samp_rate = 44000

    ##################################################
    # Blocks
    ##################################################
    self.rational_resampler_xxx_0 = filter.rational_resampler_ccc(
            interpolation=2400000,
            decimation=88200,
            taps=None,
            fractional_bw=None,
    )

    self.osmosdr_sink_0 = osmosdr.sink( args="numchan=" + str(1) + " " + "" )
    self.osmosdr_sink_0.set_sample_rate(2400000)
    self.osmosdr_sink_0.set_center_freq(463025000, 0)
    self.osmosdr_sink_0.set_freq_corr(6, 0)
    self.osmosdr_sink_0.set_gain(0, 0)
    self.osmosdr_sink_0.set_if_gain(30, 0)
    self.osmosdr_sink_0.set_bb_gain(20, 0)
    self.osmosdr_sink_0.set_antenna("", 0)
    self.osmosdr_sink_0.set_bandwidth(10000, 0)

    self.blocks_wavfile_source_0 = blocks.wavfile_source("/home/ahmad/Test123.wav", True)
    self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((2, ))
    self.analog_nbfm_tx_0 = analog.nbfm_tx(
        audio_rate=44100,
        quad_rate=88200,
        tau=75e-6,
        max_dev=5e3,
            )

    ##################################################
    # Connections
    ##################################################
    self.connect((self.analog_nbfm_tx_0, 0), (self.rational_resampler_xxx_0, 0))    
    self.connect((self.blocks_multiply_const_vxx_0, 0), (self.analog_nbfm_tx_0, 0))    
    self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_multiply_const_vxx_0, 0))    
    self.connect((self.rational_resampler_xxx_0, 0), (self.osmosdr_sink_0, 0))    

tb = top_block_cls()
i = 0
while i < 5:
    tb.run()
    i = i + 1

上面的代码为什么只发送一次,其余时间跳过运行cmd,我认为这些块中有一些布尔值,表明工作已经完成?并且需要重置。谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

可以重用顶部块,但是您需要考虑顶部块的状态。特别是,很可能文件源块仍位于文件末尾。

选择一个解决方案:

  • 告诉文件源块重新开始或重新打开同一文件。 (wavfile_source块不可用,因此您必须使用其他解决方案。)
  • 将其替换为新创建的文件源块。 (这种方法的优点是可以推广到所有类型的源块。)

    要替换某个块,而流程图未运行,请使用self.disconnect(...)(与self.connect(...)相同的参数)从其中删除连接,然后使用{{ 1}}新区块。

  • 创建一个新的self.connect(...),而不是重复使用上一个。 (这可以确保完全不执行上一次运行的状态,但是当然可能需要更多时间。)