使用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
相关产品推荐
相关产品推荐

