GNU Radio自动获取PlutoSDR URI:Python块输出及静态URI方案
解决PlutoSDR在GNU Radio中URI自动获取与静态化问题
问题背景
使用GNU Radio设计时,PlutoSDR源/宿模块需要指定设备URI才能通信,但每次断开重连设备后,USB端口对应的URI(如usb:3.16.5)会变化,需手动修改模块参数。尝试通过Python块执行bash命令提取URI,但无法将字符串结果输出到GNU Radio变量中,且当前块仅支持输出complex、float等数值类型流,无法直接输出字符串。
现有Python块代码
def __init__(self, filename="/home/cheikh/Desktop/file.txt", time_period=0.08,): # only default arguments here """arguments to this function show up as parameters in GRC""" gr.sync_block.__init__( self, name='Variable Read', # will show up in GRC in_sig=[], out_sig=[np.float32, np.float32, np.float32, np.int32] ) device_ul = os.system('iio_info -S usb | grep -o "\[.*\]" | sed "s/\[//;s/\]//" | sed -n 1p') device_dl = os.system('iio_info -S usb | grep -o "\[.*\]" | sed "s/\[//;s/\]//" | sed -n 2p') self.filename = filename self.time_period = time_period
iio_info -S 输出示例
my_user@my_host:~$ iio_info -S Library version: 0.23 (git tag: v0.23) Compiled with backends: local xml ip usb Available contexts: 0: 0456:b673 (Analog Devices Inc. PlutoSDR (ADALM-PLUTO)), serial=1044730a1997000308002600b6e27b7583 [usb:3.16.5] 1: 0456:b673 (Analog Devices Inc. PlutoSDR (ADALM-PLUTO)), serial=1044739659930001200022003d35290588 [usb:3.17.5]
解决方案
方案1:通过Python表达式直接在模块参数中获取URI
GNU Radio支持在模块参数中使用Python表达式,无需额外编写流块。直接在PlutoSDR源/宿模块的URI字段中填入以下代码,即可自动提取对应设备的URI:
获取第一个设备URI(对应device_ul)
import subprocess, re def get_pluto_uri(index=0): output = subprocess.check_output(['iio_info', '-S', 'usb']).decode('utf-8') # 匹配括号中的USB URI matches = re.findall(r'\[(usb:[^\]]+)\]', output) return matches[index] if len(matches) > index else '' get_pluto_uri(0)
获取第二个设备URI(对应device_dl)
将上述代码最后一行改为get_pluto_uri(1)即可。
注意:之前使用os.system的错误在于,它返回的是命令执行的退出码而非输出内容,改用subprocess.check_output才能正确获取命令输出。
方案2:使用设备Serial号实现静态URI
相比依赖USB端口的URI,使用设备唯一的Serial号可以实现静态识别,无需关心端口变化:
- 从
iio_info -S输出中提取设备的Serial号(如第一个设备的1044730a1997000308002600b6e27b7583) - 在PlutoSDR模块的
URI字段中填入serial:你的设备Serial号,例如:serial:1044730a1997000308002600b6e27b7583
这样无论设备重连多少次,只要是同一台PlutoSDR,都能被正确识别。
关于Python块输出字符串的说明
GNU Radio的流块(如gr.sync_block)设计用于处理连续的采样数据流,无法直接输出字符串到GNU Radio变量——变量是在流图初始化阶段确定的,而非流运行阶段。因此,直接在模块参数中使用Python表达式或采用Serial号静态URI是更高效的解决方案。
内容的提问来源于stack exchange,提问作者Abdallah Sheikh
相关产品推荐
相关产品推荐

