有没有办法通过 运行() 函数重新 运行 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
而不是重复使用前一个。 (这确保之前 运行 中的任何状态都不会被执行,但当然可能需要更多时间。)
我已经设置了 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
而不是重复使用前一个。 (这确保之前 运行 中的任何状态都不会被执行,但当然可能需要更多时间。)