<div dir="ltr"><div dir="ltr">Hello all,<br><br>I'm relatively new to world of USRP, and having some problems with configuring <br>two USRP N210 devices to receive simultaneously. I am just trying to do a proof<br>of concept type of experiment. <br><br>In my setup one of the N210.s is equipped with a WBX daughterboard and the other<br>with a TVRX2 daughterboard, as my frequency of interest lies within the FM-radio<br>region. The devices are connected to each other via a MIMO cable. One port on each<br>device is connected to an antenna (Port RX2 on the master device equipped with the <br>WBX and port RX1 on the slave device equipped with the TVRX2). So far I think I <br>have gotten my setup to run smoothly, except for when I am receiving a signal only <br>one of the two ports in which I have my antennas connected is showing a signal.<br><br>I'm using the UHD C++ API to configure the system. I think my problem lies within <br>my inability set the channel configuration settings correctly. The configuration <br>settings are displayed in the code below. Another possible reason for this situation <br>could be that there is some problem with how I have setup the buffering.<br><br>The code:<br><br>int UHD_SAFE_MAIN(int argc, char *argv[]){ <br><br>    std::string ant_ch0("RX2");<br>    std::string ant_ch1("RX1");<br>    std::string ref("mimo");<br>    std::string time("mimo");<br><br>    //Master device address<br>    std::string master_args("192.168.10.2");<br><br>    // Slave device address<br>    std::string slave_args("192.168.10.3");<br>    <br>    // sub_dev parameters for channel mapping<br>    std::string subdev0("A:0");<br>    std::string subdev1("A:RX1");<br><br>    // Numbers taken by using command uhd_find_devices in terminal<br>    //int master_index = 1;    <br>    //int slave_index = 0;<br>    <br>    // Common variables<br>    double freq(105e6);<br>    double gain(10);<br>    double bw(1.7e6);<br>    double rate2(1e7); // for data transmission rate from USRP to host<br>    <br>    // Channel numbers<br>    size_t ch1 = size_t(~0);<br>    size_t ch0 = size_t(~0);<br>    ch1 = 1;<br>    ch0 = 0;<br>    <br>    // Motherboard indices for setting sources<br>    const size_t mb1 = 1;<br>    const size_t mb0 = 0;<br>    <br><br>    // --------------------------- CONFIGURATION ---------------------------        <br>    <br>    // Addressing and defining the usrp devices<br>    uhd::device_addr_t addresses("addr0=192.168.10.2, addr1=192.168.10.3");<br>    uhd::usrp::multi_usrp::sptr usrp =uhd::usrp::multi_usrp::make(addresses);<br>    <br>    // Setup Subdevice specification:<br>    // The subdev spec maps a physical part of the daughter board to a channel number<br>    // Here we create two channels on two separate mboards on two separate usrp devices<br>    usrp->set_rx_subdev_spec(subdev0,ch0); <br>    usrp->set_rx_subdev_spec(subdev1,ch1); <br><br>    // Set rx rate (rate at which the data is <br>    //transferred between the host and the device)<br>    usrp->set_rx_rate(rate2); // sets across all channels<br><br><br>    // Throw error if exactly two mother boards aren't connected<br>    UHD_ASSERT_THROW(usrp->get_num_mboards() == 2);<br>    <br>    // configuring the slave over mimo cable<br>    // make m_board 1 slave over mimo cable    <br>    usrp->set_clock_source(ref, mb1);<br>    usrp->set_time_source(ref, mb1);<br>    <br>    // Set time on master mboard  \should have master mboard number<br>    usrp->set_time_now(uhd::time_spec_t(0,0),mb0); <br>    <br>    //Set master clock rate (this affects the digitization speed)<br>    //usrp->set_master_clock_rate(rate, ch1);<br>    //usrp->set_master_clock_rate(rate, ch2);<br><br>    <br>    // Sleep a while so time can be properly locked<br>    boost::this_thread::sleep(boost::posix_time::milliseconds(100));<br><br><br>    // Set Gain<br>    usrp->set_rx_gain(gain,ch1);<br>    usrp->set_rx_gain(gain,ch0);<br><br>    // Set center frequncy<br>    uhd::tune_request_t tune_request(freq);<br>    usrp->set_rx_freq(tune_request,ch1);<br>    usrp->set_rx_freq(tune_request,ch0);<br><br>    // Set Bandwidth<br>    usrp->set_rx_bandwidth(bw,ch1);<br>    usrp->set_rx_bandwidth(bw,ch0);<br>    <br>    <br>    // Set antenna to recieve only<br>    usrp->set_rx_antenna(ant_ch1,ch1);<br>    usrp->set_rx_antenna(ant_ch0,ch0);<br><br>    //-------------- GET AND WRITE DATA STREAM TO FILE ----------------<br>    <br>    // SETUP STREAMING PARAMETERS<br>    uhd::stream_args_t stream_args("fc32","sc16");<br>    <br>    // channels to use<br>    int c1 =0;<br>    int c2 =1;<br>    std::vector<int>  channel_nums(2);<br>    channel_nums[1] = c1;<br>    channel_nums[2] = c2;    <br>    <br>    <br>    uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);<br>    <br>    double seconds_in_future = 1.5;<br>    double total_num_samps = 10000;<br>    // the first call to recieve will later on block this many seconds before recieving<br>    double timeout = seconds_in_future +0.1;<br>    size_t num_acc_samps = 0; //number of accumulated samples<br><br><br>    uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);<br>    stream_cmd.num_samps = total_num_samps;<br>    stream_cmd.stream_now = false;<br>    stream_cmd.time_spec = uhd::time_spec_t(seconds_in_future);<br>    rx_stream->issue_stream_cmd(stream_cmd);<br>    <br>    //std::cout << "H2" << std::endl;<br>    <br>    // CREATE BUFFERS<br>    uhd::rx_metadata_t md; // will be filled automatically when data is recieved<br>    const size_t samps_per_buff = rx_stream->get_max_num_samps();<br>    <br><br>    // 2D buffer vector<br>    std::vector<std::vector<std::complex<float> > > buffs(<br>        usrp->get_rx_num_channels(), std::vector<std::complex<float> > (samps_per_buff));<br><br>    // Vector of pointers to point to each of the channel buffers<br>    std::vector<std::complex<float>*> buff_ptrs;<br>    for (size_t i=0; i<buffs.size();i++) buff_ptrs.push_back(&buffs[i].front());<br><br>    ///////////////////// CREATION OF FILES TO STREAM IN ///////////////////////////<br>    // The file names<br>    std::string file1 = "ch1_d.dat";<br>           std::string file2 = "ch2_d.dat";<br>    <br>    // Open actual files<br>    std::ofstream outfile1;<br>    outfile1.open(file1.c_str(), std::ofstream::binary);<br>    <br>    std::ofstream outfile2;<br>    outfile2.open(file2.c_str(), std::ofstream::binary);<br>    <br>    ////////////////////////////////////////////////////////////////////////////////<br><br>    <br>    // THE ACTUAL RECIEVE STREAMING AND  WRITING IS DONE HERE<br>    while(num_acc_samps < total_num_samps){<br>        // RECIEVING A SINGLE PACKET<br>        size_t num_rx_samps = rx_stream->recv(buff_ptrs, samps_per_buff, md, timeout);<br>        <br>        // use small timeout for subsequent packets<br>        timeout=0.1;<br>        <br>    <br>        // ERROR HANDLING<br>        if (md.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT){ <br>            std::cout << boost::format("Timeout while streaming") << std::endl;<br>            break;<br>        }<br>    <br>        if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){<br>            throw std::runtime_error(str(boost::format("Reciever Error %s")<br>                %md.strerror()));<br>        }<br>        <br>        std::cout <<boost::format(<br>                "Received packet: %u samples, %u full secs, %f frac secs") <br>            %num_rx_samps % md.time_spec.get_full_secs() <br>            %md.time_spec.get_frac_secs() << std::endl;<br>    <br>        <br>        // WRITING TO FILE<br>        if (outfile1.is_open())<br>            outfile1.write((const char*) &buffs[0].front(), <br>                num_rx_samps*sizeof(std::complex<float>));<br>        <br>        if (outfile2.is_open())<br>            outfile2.write((const char*) &buffs[1].front(), <br>                num_rx_samps*sizeof(std::complex<float>));<br><br><br>        num_acc_samps += num_rx_samps;                <br>    }<br><br>    if (num_acc_samps<total_num_samps) std::cerr << "Recieve timeout before"<br>             << "all samples received..." << std::endl;<br>    <br>    // close files<br>    if(outfile1.is_open())<br>        outfile1.close();<br><br>    if(outfile2.is_open())<br>        outfile2.close();<br><br><br>    //finished<br>    std::cout<<std::endl << "Done!" <<std::endl<<std::endl;<br><br>    return EXIT_SUCCESS;<br>}<br><br>To clarify, when I plot the received signals one of the channels shows a smooth FM-signal,<br>while the other plot shows horizontal line with an amplitude of zero. Most of the<br>code has been created using the USRP examples, with a few tweaks here and there.<br><br>The command usrp->get_pp_string(), returns the following configuration summary: <br><br>Using Devices: Multi USRP:<br>  Device: USRP2 / N-Series Device<br>  Mboard 0: N210r4<br>  Mboard 1: N210r4<br>  RX Channel: 0<br>    RX DSP: 0<br>    RX Dboard: A<br>    RX Subdev: WBXv3 RX+GDB<br>  RX Channel: 1<br>    RX DSP: 0<br>    RX Dboard: A<br>    RX Subdev: TVRX2<br>  TX Channel: 0<br>    TX DSP: 0<br>    TX Dboard: A<br>    TX Subdev: WBXv3 TX+GDB<br>  TX Channel: 1<br>    TX DSP: 0<br>    TX Dboard: A<br>    TX Subdev: Unknown (0xffff) - 0<br>0x6325a8<br><br>The code compiles, and can also be run without any errors.<br>Any help concerning the issue would greatly appreciated as I am also running on <br>a tight schedule. <br><br>Thanks already in advance<br> -Julian <br><br></div></div>