GNURadio 3.10.4中Head Block停止后如何重启流图并重新采集?
问题分析与解决
核心问题
你的代码逻辑错误在于:第一次调用tb.wait()后,整个流图已经完全终止——因为Head Block输出完指定数量的数据后会发送EOS(End of Stream)信号,触发所有Block停止运行并进入终止状态。此时再次调用tb.start()无法让流图重新工作,因为Head Block已经耗尽了预设的采集量,File Sink也已关闭,USRP Source同样处于停止状态。
另外,tb.lock()/tb.unlock()是用于流图运行过程中修改参数的机制,而你是在流图终止后进行配置,这两个调用完全多余。
修正方案
要实现两次固定量采集,需要在第一次采集完成后,重置流图中所有Block的状态,重新配置参数后再启动流图。具体步骤如下:
- 第一次采集完成后,先确保流图完全停止并重置状态
- 重新配置USRP Source的参数
- 重置Head Block的采集数量
- 重新指定File Sink的输出文件(或重置其写入状态)
- 再次启动流图
修正后的代码示例
# 第一次采集:获取固定量数据 tb.start() tb.wait() # 等待流图终止 # 重置流图状态,让所有Block回到初始状态 tb.stop() tb.reset() # 重新配置USRP(示例:修改中心频率、增益) usrp_source.set_center_freq(915e6) usrp_source.set_gain(30) # 重置Head Block的采集数量(必须重新设置,否则不会输出新数据) head.set_nitems(1000000) # 重置File Sink:关闭旧文件,打开新文件 file_sink.open("second_capture.dat") # 第二次采集 tb.start() tb.wait() # 清理流图 tb.stop() tb.wait()
关键知识点(对应GNURadio官方文档要点)
tb.wait():会阻塞直到流图处理完所有数据并完全终止,此时所有Block都进入停止状态,无法直接重启。tb.reset():重置整个流图中所有Block的内部状态,将其恢复到初始配置,是终止后重新启动流图的必要操作。- Head Block:
nitems参数是一次性的,采集完成后会停止输出,必须重新设置该参数才能再次采集。 - File Sink:流图终止时会自动关闭文件,再次采集前需要调用
open()方法指定新的输出路径,否则无法写入数据。 - USRP Source:在流图终止状态下可以直接调用
set_*系列方法修改参数(如频率、增益、采样率),无需使用lock()/unlock()——这两个方法仅用于流图运行时的动态参数调整。
内容的提问来源于stack exchange,提问作者Cines
相关产品推荐
相关产品推荐

