Gnuradio,OOT:正在更正标记流块的send()

Gnuradio,OOT: correcting send() for tagged stream block?

本文关键字:send OOT Gnuradio      更新时间:2023-10-16

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

我正在尝试制作2 TX 1Rx标记流块(OOT)。对于1Tx 1Rx运行良好。我正试图延长它。现在的问题是,我没有能够配置send()函数。有了这个代码,一个发射机发射,但另一个不工作。子开发规范、频率和其他参数分配正确。我查过了。

如果我试着做测试,它并没有显示出任何问题。我检查了我的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的规格、增益和频率分配。那些都很好。

完整性:这是昨天GNU电台邮件列表上的问题;Sanjoy已经得到了两个回应:

马丁·布劳恩写道:

对不起,Sanjoy,

我们需要更多的信息才能给你更好的信息反馈目前还不清楚你到底想实现什么,而且到底是什么失败了。

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

干杯,Martin

我的答案有点长,但这里有。摘录:

你好,Sanjoy,

我正在尝试制作2 TX 1Rx标记流块(OOT)。对于1Tx 1Rx,它运行良好。我正在努力扩展它。现在的问题是,我我无法配置send()函数。

有没有你创建自己的区块的特殊原因?有什么功能吗在USRP水槽和gr-uhd附带的来源上失踪?

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

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

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

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