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

使用UHD API驱动B210时设置增益遇通道越界错误求助

UHD B210接收程序通道越界错误解决方案

错误原因分析

报错中的18446744073709551615是size_t类型的最大值,对应有符号数-1的无符号转换,说明代码中存在未定义行为导致内存破坏,进而传入了无效的通道索引。

具体问题与修复代码

1. 格式化字符串类型不匹配(核心问题)

原代码用浮点数格式符%f格式化字符串变量subdev,触发未定义行为,破坏内存:

// 错误代码
std::cout << boost::format("subdev set to: %f") % subdev << std::endl;

修复为字符串格式符%s:

// 修复后
std::cout << boost::format("subdev set to: %s") % subdev << std::endl;

2. 未初始化的subdev变量

subdev默认是空字符串,显式设置B210的默认子设备(或根据需求配置):

// 在变量定义时初始化,或添加命令行选项
std::string subdev = "A:0"; // B210默认RX子设备,支持通道0;双通道可设为"A:0,B:0"

建议在程序选项中添加subdev参数,方便灵活配置:

desc.add_options()
    // ... 其他选项
    ("subdev", po::value<std::string>(&subdev)->default_value("A:0"), "RX subdevice specification")
;

3. 获取增益时传入错误参数

原代码用字符串的字符值作为通道号(channel_list[0]是字符'0',ASCII码48),而非解析后的通道索引:

// 错误代码
std::cout << boost::format("Actual RX Gain: %f dB...")
                 % usrp->get_rx_gain(channel_list[0])
          << std::endl;

修复为使用解析后的channel_nums:

// 修复后
std::cout << boost::format("Actual RX Gain: %f dB...")
                 % usrp->get_rx_gain(channel_nums[0])
          << std::endl;

4. 硬编码访问不存在的通道

调试代码中直接访问通道1,但用户指定的是通道0,若设备未配置双通道会出错:

// 错误代码
std::cout << usrp->get_rx_subdev_name(1)<< std::endl;
std::cout << usrp->get_rx_gain(1)<< std::endl;

修复为遍历已解析的通道号:

// 修复后
for (size_t chan : channel_nums) {
    std::cout << "RX subdev name for channel " << chan << ": " << usrp->get_rx_subdev_name(chan) << std::endl;
    std::cout << "RX gain for channel " << chan << ": " << usrp->get_rx_gain(chan) << std::endl;
}

5. 未定义变量问题

  • 将rx_stream->recv(buffs, buff0.size(), md, timeout, true)中的buff0改为buff;
  • 删除无意义的delete A;语句。

6. 缺失头文件

修复include <csignal>为#include <csignal>。

修复后的关键代码片段示例

// 添加subdev命令行选项
desc.add_options()
    ("subdev", po::value<std::string>(&subdev)->default_value("A:0"), "RX subdevice specification")
    // ... 其他选项
;

// 正确格式化输出subdev
std::cout << boost::format("subdev set to: %s") % subdev << std::endl;
usrp->set_rx_subdev_spec(subdev);

// 获取实际增益
if (vm.count("gain")) {
    std::cout << boost::format("Setting RX Gain: %f dB...") % gain << std::endl;
    usrp->set_rx_gain(gain, uhd::usrp::multi_usrp::ALL_CHANS);
    std::cout << boost::format("Actual RX Gain: %f dB...")
                     % usrp->get_rx_gain(channel_nums[0])
              << std::endl << std::endl;
}

// 调试输出通道信息
for (size_t chan : channel_nums) {
    std::cout << "RX subdev name for channel " << chan << ": " << usrp->get_rx_subdev_name(chan) << std::endl;
    std::cout << "RX gain for channel " << chan << ": " << usrp->get_rx_gain(chan) << std::endl;
}

// 正确调用recv
size_t num_rx_samps = rx_stream->recv(buffs, buff.size(), md, timeout, true);

测试验证

修复后重新编译,执行原命令:

./uhd_basic --nsamps 2040 --rate 1e6  --freq 91.9e6 --channel 0 --gain 20

若使用双通道,可修改命令为:

./uhd_basic --nsamps 2040 --rate 1e6  --freq 91.9e6 --channel 0,1 --gain 20 --subdev "A:0,B:0"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:07:01