You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的状态,重新配置参数后再启动流图。具体步骤如下:

  1. 第一次采集完成后,先确保流图完全停止并重置状态
  2. 重新配置USRP Source的参数
  3. 重置Head Block的采集数量
  4. 重新指定File Sink的输出文件(或重置其写入状态)
  5. 再次启动流图

修正后的代码示例

# 第一次采集:获取固定量数据
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:20:59