有没有办法通过 运行() 函数重新 运行 top_block ?

Is there a way to rerun top_block via the run() function?

我已经设置了 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,我认为这些块有一些布尔值表明工作已经完成?它需要重置。感谢您的宝贵时间!

可以重用顶层块,但您需要考虑其中块的状态。特别是,您的文件源块很可能仍位于 end-of-file.

选择一个解决方案:

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

    要替换块,而流程图是不是 运行ning,使用self.disconnect(...)(与self.connect(...)相同的参数)从中删除连接,然后 self.connect(...) 新块。

  • 创建一个新的 top_block_cls 而不是重复使用前一个。 (这确保之前 运行 中的任何状态都不会被执行,但当然可能需要更多时间。)