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

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号可以实现静态识别,无需关心端口变化:

  1. 从iio_info -S输出中提取设备的Serial号(如第一个设备的1044730a1997000308002600b6e27b7583)
  2. 在PlutoSDR模块的URI字段中填入serial:你的设备Serial号,例如:
    serial:1044730a1997000308002600b6e27b7583
    

这样无论设备重连多少次,只要是同一台PlutoSDR,都能被正确识别。

关于Python块输出字符串的说明

GNU Radio的流块(如gr.sync_block)设计用于处理连续的采样数据流,无法直接输出字符串到GNU Radio变量——变量是在流图初始化阶段确定的,而非流运行阶段。因此,直接在模块参数中使用Python表达式或采用Serial号静态URI是更高效的解决方案。

内容的提问来源于stack exchange,提问作者Abdallah Sheikh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:20:44