c++ 如何使用UHD从USRP流式传输固定数量的样本

y3bcpkx1  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(161)

我尝试使用UHD库从USRP X310设备流式传输固定/精确数量的样本。我已经参考了UHD GitHub page上的一些示例代码。我使用了while循环,建议一次一个数据包地将数据流式传输到缓冲区。我的问题是,最后一个部分数据包(参见下面的示例)从未被接收或放入我的缓冲区,我得到了uhd::rx_metadata_t::ERROR_CODE_TIMEOUT错误响应。

// Instantiate RX Streamer
uhd::stream_args_t streamArgs("fc32");
// Set the number of samples per packet
streamArgs.args["spp"] = "200";
rxStream = usrpDevice->get_rx_stream(streamArgs);
    
// Configure RX Streamer for fixed number of samples
uhd::stream_cmd_t streamCmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);
streamCmd.num_samps = 1100;
streamCmd.stream_now = true;
rxStream->issue_stream_cmd(streamCmd);

// Initialize RX metadata structure
uhd::rx_metadata_t md;

// Create buffer to stream samples to
std::vector<std::complex<float>> buff(rxStream->get_max_num_samps()); // buff size = 200

size_t numAccSamples = 0;

while (numAccSamples < 1100)
{
    size_t numRXSamples = rxStream->recv(&buff.front(), buff.size(), md);
    
    // Handle streaming error codes
    switch (md.error_code)
    {
        // No errors
        case uhd::rx_metadata_t::ERROR_CODE_NONE:
            break;
            
        case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: // I get this error on the expected last iteration of the while loop
            if (numAccSamples == 0)
            {
                continue;
            }
            throw std::runtime_error("ERROR_CODE_TIMEOUT: Got timeout before all samples received");
            
            default:
                throw std::runtime_error("Got error code " + md.error_code);
        }
        
        // process data here

        numAccSamples += numRXSamples;
    }

字符串
例如,如果我想要流式传输1100个样本,并且我的数据包大小设置为200,则我的while循环将成功运行5次并填充缓冲区。(我有1000/1100个样本),对recv()的调用得到一个超时错误,样本没有被传递到我的缓冲区。在这一点上,我还没有流所有1100个样本。
我如何才能获得我的确切数量的样本?
下面是recv()调用的文档链接以供参考。

tkclm6bt

tkclm6bt1#

经过多次试验和错误,我发现这个问题是因为USRP上没有设置采样率参数。所以在尝试流式传输样本之前,请确保设置采样率!

usrpDevice->set_rx_rate(50e6);

// stream samples

字符串

gv8xihay

gv8xihay2#

你说的完全正确。如果你使用交替通道进行流,这就消除了“O”,“D”的过载。在Python API中,同样的问题

相关问题