我需要帮助制作一个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规范,增益和频率分配。那些 很好。
答案 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(...),并使您的流图消耗并生成不同线程的样本,连贯。