Gnuradio,OOT:纠正标记流阻塞的send()?

时间:2015-06-25 08:17:22

标签: c++ gnuradio usrp

我需要帮助制作一个gnuradio OOT模块。我实际上是在尝试扩展一个代码。

我正在尝试制作2 TX 1Rx标记流阻止(OOT)。对于1Tx 1Rx,它 工作正常。我试图扩展它。现在的问题是,我不是 能够配置send()函数。使用此代码,一个发送器发送,但其他发送器不起作用。正确分配了subdev规范和频率以及其他参数。我查了一下。

如果我尝试进行测试,则不会显示任何问题。我查了一下 我的USRP X310的端口,工作正常。

这是代码。我提出了一个处理发送和接收缓冲区的简短部分。

void
usrp_echotimer_cc_impl::send()
{
// Data to USRP
num_tx_samps = d_tx_stream->send(d_in_send1, total_num_samps,
d_metadata_tx, total_num_samps/(float)d_samp_rate+d_timeout_tx);
num_tx_samps = d_tx_stream->send(d_in_send0, total_num_samps,
d_metadata_tx, total_num_samps/(float)d_samp_rate+d_timeout_tx);
}

int
usrp_echotimer_cc_impl::work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
gr_complex *in0 = (gr_complex *) input_items[0];
gr_complex *in1 = (gr_complex *) input_items[1];
gr_complex *out = (gr_complex *) output_items[0];
// Set output items on packet length
noutput_items = ninput_items[0]=ninput_items[1];

// Resize output buffer
if(d_out_buffer.size()!=noutput_items)
d_out_buffer.resize(noutput_items);

// Send thread
d_in_send0 = in0;
d_in_send1 = in1;
d_noutput_items_send = noutput_items;
d_thread_send =
gr::thread::thread(boost::bind(&usrp_echotimer_cc_impl::send, this));

// Receive thread
d_out_recv = &d_out_buffer[0];
d_noutput_items_recv = noutput_items;
d_thread_recv =
gr::thread::thread(boost::bind(&usrp_echotimer_cc_impl::receive, this));

我的系统配置是X310,子板SBX-120,我使用的是UHD-3.9。我检查了subdev规范,增益和频率分配。那些 很好。

1 个答案:

答案 0 :(得分:2)

为了完整性: 昨天在GNU Radio邮件列表中已经提到过这个问题; Sanjoy已经收到两份回复:

Martin Braun写道:

  

抱歉,Sanjoy,

     

在我们为您提供更好的服务之前,我们需要更多信息   反馈。它并不清楚你到底想要实现什么,以及   究竟是什么失败了。

     

也许这有助于入门:   http://gnuradio.org/redmine/projects/gnuradio/wiki/ReportingErrors

     

干杯,马丁

我的回答有点长,但它可用here。摘录:

  

嗨Sanjoy,

     
    

我正在尝试制作2 TX 1Rx标记流阻止(OOT)。对于1Tx 1Rx,它工作正常。我试图扩展它。现在的问题是,我     我无法配置send()函数。

  
     

有没有   您创建自己的区块的特殊原因是什么?有功能吗?   USRP下沉和gr​​-uhd附带的消息来源?

...

  

你的send()函数看起来有点奇怪;你正在做的是什么   在一个通道上相互传输两个东西。也,   你应该做什么(从编程风格的角度来看)是   传递要作为引用或其他东西发送的缓冲区,但不是   将它们保存到类属性,然后调用send()。送两个   缓冲到两个不同的通道,您将需要使用向量   包含两个缓冲区 - 看看rx_multi_samples;那个   当然是recv()而不是send(),但语义是一样的。

...

  

noutput_items给你现在让你的工作可以产生多少,这就是为什么它是一个参数。

...

  

没有理由GNU Radio无法再次调用你的工作函数,而usrp_echotimer_cc_impl :: send()甚至没有开始传输样本。然后,您的d_send变量将被覆盖。

...

  

由于单个X310本质上是连贯的并且具有相同的时间,因此您可以简单地使用USRP接收器和源,使用相同时间规范的set_start_time(...),并使您的流图消耗并生成不同线程的样本,连贯。