Just to help in understanding what’s wrong with my code I attach here the two 
implementations, one with the multi usrp and the other with RFNoC. Reading the 
documentation I understand that the MultiUSRP stands on top of the RFNoC, so I 
think that it is only a problem of my implementation.

They should do the same thing, however in RFNoC implementation the receiver on 
the other side loses lock frequently.

Could someone help me understanding what’s wrong?
#include <iostream>
#include <uhd/types/tune_request.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/thread.hpp>
#include <uhd/rfnoc/block_id.hpp>
#include <uhd/rfnoc/duc_block_control.hpp>
#include <uhd/rfnoc/mb_controller.hpp>
#include <uhd/rfnoc/radio_control.hpp>
#include <uhd/rfnoc/replay_block_control.hpp>
#include <uhd/rfnoc_graph.hpp>
#include <fstream>

#define BUFFERSIZE 8192
using namespace std;

int UHD_SAFE_MAIN(int argc, char* argv[])
{
    const double rate = 6.25e6;                     // Sample rate
    const double freq = 868.5e6;                   // Center frequency
    const double gain = 10;                      // TX gain
    const string device_addr = "type=x300,addr=192.168.40.2";          // Default (first device)
    const string filename = "rawiq.sc16";
    
    uhd::rfnoc::rfnoc_graph::sptr graph;
    uhd::rfnoc::block_id_t radio_control_id;
    uhd::rfnoc::radio_control::sptr radio_control ;
    uhd::rfnoc::block_id_t duc_control_id;
    uhd::rfnoc::duc_block_control::sptr duc_control ;

    graph = uhd::rfnoc::rfnoc_graph::make(device_addr.c_str());

    radio_control_id = uhd::rfnoc::block_id_t(0, "Radio", 1) ;
    radio_control = graph->get_block<uhd::rfnoc::radio_control>(radio_control_id) ;
    radio_control->set_tx_gain(gain,0);
    radio_control->set_tx_frequency(freq,0);
    if( !radio_control ) {
        cout << "ERROR: Failed to find Radio Block Controller!" << endl ;
    }
    cout << "Using radio " << radio_control_id << endl ;

    // DUC Block Controller
    duc_control_id = uhd::rfnoc::block_id_t(0, "DUC", 1) ;

    duc_control = graph->get_block<uhd::rfnoc::duc_block_control>(duc_control_id) ;
    if( !duc_control ) {
        cout << "ERROR: Failed to find DUC Block Controller!" << endl ;
    }
    cout << "Using duc " << duc_control_id << endl ;
    duc_control->set_output_rate(200e6,0);
    duc_control->set_freq(0,0);
    duc_control->set_input_rate(rate,0);
    uhd::stream_args_t stream_args("sc16", "sc16");
    auto tx_stream = graph->create_tx_streamer(1, stream_args);
    graph->connect(tx_stream,0,duc_control->get_unique_id(),0);
    graph->commit();

    std::this_thread::sleep_for(std::chrono::seconds(1));


    int k = 0;
    ifstream *infile;
    infile = new ifstream(filename, std::ios::binary);

    uhd::tx_metadata_t md;
    md.start_of_burst = true; // Start of burst
    md.end_of_burst = false;  // We will stop this later
    md.has_time_spec = false;

    std::vector<std::complex<short>> buff(BUFFERSIZE);
    cout << "Starting transmission" << endl;
    while (!infile->eof()) {
        infile->read(reinterpret_cast<char*>(&buff.front()), BUFFERSIZE * sizeof(complex<short>));
        size_t samples_read = infile->gcount() / sizeof(complex<short>);
        if (samples_read == 0)
        {
            cout<<"No samples read\r\n";
            break;
        }

        
        tx_stream->send(&buff.front(), samples_read, md);
        md.start_of_burst = false;
    }
    md.end_of_burst = true;
    tx_stream->send("", 0, md);
    infile->close();
    cout << "Transmission complete." << endl;



    return 0;
}
#include <iostream>
#include <uhd/types/tune_request.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/thread.hpp>
#include <fstream>

#define BUFFERSIZE 8192
using namespace std;

int UHD_SAFE_MAIN(int argc, char* argv[])
{
    const double rate = 6.25e6;                     // Sample rate
    const double freq = 868.5e6;                   // Center frequency
    const double gain = 10;                      // TX gain
    const string device_addr = "type=x300,addr=192.168.40.2";          
    const string filename = "rawiq.sc16";
    uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(device_addr);
    usrp->set_tx_rate(rate,1);
    usrp->set_tx_freq(freq,1);
    usrp->set_tx_gain(gain,1);
    usrp->set_tx_antenna("TX/RX",1);
    uhd::stream_args_t stream_args("sc16", "sc16");
    stream_args.channels = {1};
    auto tx_stream = usrp->get_tx_stream(stream_args);
    
    std::this_thread::sleep_for(std::chrono::seconds(1));


    int k = 0;
    ifstream *infile;
    infile = new ifstream(filename, std::ios::binary);

    uhd::tx_metadata_t md;
    md.start_of_burst = true; // Start of burst
    md.end_of_burst = false;  // We will stop this later
    md.has_time_spec = false;

    std::vector<std::complex<short>> buff(BUFFERSIZE);
    cout << "Starting transmission" << endl;
    while (!infile->eof()) {
        infile->read(reinterpret_cast<char*>(&buff.front()), BUFFERSIZE * sizeof(complex<short>));
        size_t samples_read = infile->gcount() / sizeof(complex<short>);
        if (samples_read == 0)
        {
            cout<<"No samples read\r\n";
            break;
        }

        
        tx_stream->send(&buff.front(), samples_read, md);
        md.start_of_burst = false;
    }
    md.end_of_burst = true;
    tx_stream->send("", 0, md);
    infile->close();
    cout << "Transmission complete." << endl;



    return 0;
}
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to