GNU Radio流图如何在指定时长后自动停止?(FM接收器录1毫秒数据)
解决GNU Radio流图自动停止采集1毫秒数据的方案
我刚接触GNU Radio做FM接收器的时候,也碰到过类似的自动停止流图的问题,针对你要采集1毫秒数据的需求,这里有几个亲测可行的方案,你可以根据自己的情况选:
方案1:用GRC内置模块(无需改代码,新手友好)
最省心的方式是用Tagged Stream Terminator配合Timestamp Tagger来精准控制采样数量:
- 首先添加
Timestamp Tagger模块,把它的采样率设置成你流图的实际采样率(比如你的FM接收器用2MSPS的话,1毫秒就是2000个采样点) - 接着添加
Tagged Stream Terminator模块,在参数里把max length设置为计算好的采样点数(比如2000),这个模块会在收到指定数量的采样后自动终止流图 - 把你的
File Sink和这个终止模块串联起来,确保只有目标数量的数据会被写入文件
另外还有个更简单的选项:用File Meta Sink替代普通的File Sink,直接在它的参数里设置duration为0.001秒,这个模块会自动在达到指定时长后停止录制,完全不用额外配置。
方案2:修改Python代码的正确姿势
你之前调用stop()/start()没成功,大概率是因为时机不对——GRC生成的tb.run()是阻塞式的,代码会卡在这一行直到流图手动停止,所以后面的stop()根本没机会执行。正确的做法是:
- 在生成的Python文件开头导入时间模块:
import time
- 找到原来的
tb.run(),替换成以下代码:
tb.start() # 启动流图(非阻塞模式) time.sleep(0.001) # 等待1毫秒 tb.stop() # 触发流图停止 tb.wait() # 等待流图完全关闭资源
如果需要更精准的采样数量控制,可以配合Counter模块:在流图类里写一个回调函数,当计数器达到目标采样数时调用tb.stop(),再把Counter的"Count Reached"消息连接到这个回调即可。
为什么你之前的操作没成功?
大概率是这两个原因:
- 你在
tb.run()之后调用stop(),但run()是阻塞的,代码永远执行不到stop()那一行 - 定时器的时间设置不对,比如采样率和实际不匹配导致录制时长偏差,或者
sleep的时间太短,流图还没完成初始化就被停止了
内容的提问来源于stack exchange,提问作者Raza Javed
相关产品推荐
相关产品推荐

