首页 > 其他分享 >从零开始USRP 04 连接硬件的时候的一些教训

从零开始USRP 04 连接硬件的时候的一些教训

时间:2023-04-17 10:23:21浏览次数:37  
标签:uhd usrp0 04 stream cmd rx usrp1 从零开始 USRP

在连接硬件的时候出现了一堆问题,大概记录一下。

我用的代码是:https://www.cnblogs.com/loveandninenine/p/17286194.html

然而,连接到硬件上,收端收不到,发射端发不出去,哈哈哈哈哈哈呕了。

先说一下我的硬件连接。

我一共用了三台USRP,其中A设备负责发射,BC设备负责接收。BC之间做了同步。

首先,关于发射端,我用的确实是tx.cpp那个代码,但是那个代码并没有成功发射。这里注意,发射的时候最好是设置一点间隔,比如1ms,sleep(1),不能sleep太久,也不能不sleep,否则容易导致收不到信息。

另外,传输的内容最好是用MATLAB生成的有意义的数据,这样传输过去可以查看是不是真的接受到了。

 

那有人就要问了,你是不是,硬件连接有毛病啊?天线有问题?

并没有,我用gnuradio测试过了,硬件绝对是可以正常发射和接收的,而且我没有使用天线,直接用导线连接的tx和rx口,其中用了一个分线器。然而,两边的gunradio,任意一端换成我的cpp文件都没法正常使用。

其实最后tx仍然是有点问题的,我也不知道为什么收不到,我明明是循环不停发送一个文件的啊……

最后改好了rx.cpp,可以收了。

为什么rx开始有问题?

主要是因为:stream_cmd.stream_now = false;

最一开始的时候,我们设置的这个stream_now是false。

咋说呢,最早找的rx代码其实这个值是个true,它表示控制流将立即执行流里的命令,但是为了做同步,我们需要设置成false,让两台USRP同时执行命令。

简码如下:

// create receive streamers for both USRPs
uhd::stream_args_t rx_stream_args("fc32", wire); // complex floats
rx_stream_args.channels = "0,1,2,3";
uhd::rx_streamer::sptr rx_stream_usrp0 = usrp0->get_rx_stream(rx_stream_args);
uhd::rx_streamer::sptr rx_stream_usrp1 = usrp1->get_rx_stream(rx_stream_args);

// setup streaming for both USRPs
uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
stream_cmd.stream_now = false;
stream_cmd.time_spec = uhd::time_spec_t(usrp0->get_time_now() + uhd::time_spec_t(1.0));
rx_stream_usrp0->issue_stream_cmd(stream_cmd);

stream_cmd.time_spec = uhd::time_spec_t(usrp1->get_time_now() + uhd::time_spec_t(1.0));
rx_stream_usrp1->issue_stream_cmd(stream_cmd);

// receive samples from both USRPs
uhd::rx_metadata_t md;
std::vector<std::complex<float>> buff_usrp0(usrp0_rx_buff_size);
std::vector<std::complex<float>> buff_usrp1(usrp1_rx_buff_size);

while (true) {
    size_t num_rx_samps_usrp0 = rx_stream_usrp0->recv(&buff_usrp0[0], buff_usrp0.size(), md, 1.0);
    size_t num_rx_samps_usrp1 = rx_stream_usrp1->recv(&buff_usrp1[0], buff_usrp1.size(), md, 1.0);

    // process received samples from both USRPs
    // ...
}

当然,USRP必然要声明两个,但是stream_cmd不需要那么多,可以只声明一个,但是我们声明一个之后,发现跑不起来,一直timeout,所以我们让ChatGPT帮着写了上面的版本,ChatGPT声明了两个,因此我们也照葫芦画瓢,发现仍然跑不起来……每次都是有一个能正常运行,另一个没有跑动,还是timeout。

原来,这里还涉及到一个问题,timeout的类型有很多,很多问题都可能是timeout,这里的问题在于我们没有接入时钟源。GPT老师写的没有问题,快谢谢神奇的GPT老师。

什么意思,我们做同步为什么没有接入时钟源呢?因为我们最早的时候用gnuradio跑通了,我们就把时钟源拆掉了……接下来只是在调试代码,想跑通代码,后来发现,不接入时钟源是没办法跑通的。所有的USRP都是interval的时钟源,然而两个USRP的时间并不一致, 因此虽然我们让两个USRP都获得了当前时间“get_time_now”,但是二者get到的time_now可能会差出非常离谱的误差,因此等待这几秒时间后发现,我可以走了,但是你还早着呢,或者我可以走了,但是你早就该走了,已经超时了,因此就报出了timeout。

解决方案就是找一个时钟源接入,就可以跑通啦~~~

讲道理,这些api写的真的一般,timeout能不能细化一下,我一直以为是接不到数据,结果最后的问题是接不到命令,或者命令响应超时,但凡提醒我一下这个问题我都能立马接入时钟源。

 

标签:uhd,usrp0,04,stream,cmd,rx,usrp1,从零开始,USRP
From: https://www.cnblogs.com/loveandninenine/p/17324951.html

相关文章

  • 【2023-04-14】连岳摘抄
    23:59我不是佛教徒,不相信“转生”,但如果真的再一次重新来到这个世界,我将还是“常书鸿”,我要去完成那些尚未完成的工作。我觉得这半个世纪过得太快了,敦煌研究和保护是几代人的事,还有许多事情要做。回首已过去的人生,我自豪地认为,我的人生选择没有错。我们奉献给敦煌的应该是许许多......
  • 【2023-04-15】连岳摘抄
    23:59人与人之间,要内心相通,始觉共同存在;人海苍茫,但愿有心肝的人,多多相互温暖。                                                 ——殷海光专注力始终是稀缺资源,是......
  • 从零开始学习MySQL调试跟踪(2)
    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:Yejinrong/叶金荣文章来源:GreatSQL社区投稿启用coredump制造一个coredump场景真实故障场景分析跟踪上一篇文档介绍了如何构建gdb跟踪调......
  • 产品原型13-20230416
               ......
  • 【230416-2】某校准备组件一支18人的球队,名额分配到十个班,每班至少选一人。问分配方案
    ......
  • 2023.04.16总结
    题目1:题意有\(2n\)个点,\(3n-2\)条边的无向图,对于\(i(1\lei\len)\),\(i,i+n\)连边,并且对于\(i(1\lei\len-1)\),\(i,i+1\)以及\(i+n,i+n+1\)连边。问对与\(i=1,2,3,\dots,n-1\),有几种删\(i\)条的边方式使图连通,答案对质数\(mod\)......
  • Hugging News #0414: Attention 在多模态情景中的应用、Unity API 以及 Gradio 主题构
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!社区动向Attention在视觉领域的应用注......
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之004 week01 02-04 使用泛型实现线性
    1、算法描述在数组中逐个查找元素,即遍历。2、上一篇文的实现结果在扎实打牢数据结构算法根基,从此不怕算法面试系列之003week0102-03代码实现线性查找法中,我们实现了如下代码:packagecom.mosesmin.datastructure.week01.chap02;/***@Misson&Goal代码以交朋友、传福音......
  • 贪心_20230416
    134.加油站题目说明在一条环路上有N个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,......
  • .NET周报 【4月第2期 2023-04-08】
    .NET周报【4月第2期2023-04-08】 国内文章#LRU缓存替换策略及C#实现#https://www.cnblogs.com/eventhorizon/p/17290125.html这篇文章讲述了缓存替换策略,特别是LRU算法。LRU算法基于这样一个假设:如果数据最近被访问过,那么将来被访问的几率也更高。通常我们会用双向链表......