gpt4 book ai didi

c++ - Gnu_radio,工作循环和停止

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:10 26 4
gpt4 key购买 nike

我从 gnuradio 开始,

我正在尝试创建自定义 block 。我的目标是从 txt 文件中读取十六进制数据,并以带有序言的二进制形式发送它们。

我试过下面的代码,但工作有时会在结束前退出,有时会循环......它永远不会到达转换部分。我怀疑我的 noutput 某处有问题。

在此先感谢您的帮助! :)

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "acars_gen_impl.h"

namespace gr {
namespace Acars_send {

acars_gen::sptr
acars_gen::make(char* file)
{
return gnuradio::get_initial_sptr
(new acars_gen_impl(file));
}

/*
* The private constructor
*/
acars_gen_impl::acars_gen_impl(char* file)
: gr::sync_block("acars_gen",
gr::io_signature::make(0, 0, 0),
gr::io_signature::make(1, 1, sizeof(char))),
preamble_sync{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2B,0x2A,0x16,0x16}
/*preamble_sync_bit{11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111111,11111111,
11111111,11111111,11111111,11111111,11111111,00101011,00101010,00010110,00010110}*/
{


myfile.open(file);
int ret = myfile.is_open();
printf("Fichier ouvert %d\n",ret);
}
/*
* Our virtual destructor.
*/
acars_gen_impl::~acars_gen_impl()
{
myfile.close();
printf("Fichier fermé\n");
}


/* -------------
* W O R K
-------------*/

int
acars_gen_impl::work (int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
printf("Debut WORK\n");

char *out = (char *) output_items[0];

for(int i =0; i < noutput_items; i++){
out[i] = 0;
consume_each (noutput_items);
}

/*if (noutput_items<(162))
return 0;*/
//Compte du nombre de charactères du fichier

char current_char;
int c = 0;
if (myfile.is_open()){

printf("Fichier BIEN ouvert\n");
while(myfile.get(current_char)){
printf("%c\n",current_char);
if(current_char == EOF)
{
break;
}
c++;
printf("Taille : %d\n",c);

}
}

myfile.clear();
myfile.seekg(0, std::ios::beg);

unsigned char message[c]={0};

std::string line;
getline (myfile,line);
std::cout<<line;
if (line.find("0x")==0) {
printf("Trouvé!\n");

int i = 0;

for ( std::string::iterator it=(line.begin()+2); it!=line.end(); ++it){
unsigned char hex = *it;
unsigned char conv;
printf("Conversion en cours %c\n",c);
switch(toupper(c))
{

case '0': conv = 0;
case '1': conv = 1;
case '2': conv = 2;
case '3': conv = 3;
case '4': conv = 4;
case '5': conv = 5;
case '6': conv = 6;
case '7': conv = 7;
case '8': conv = 8;
case '9': conv = 9;
case 'A': conv = 10;
case 'B': conv = 11;
case 'C': conv = 12;
case 'D': conv = 13;
case 'E': conv = 14;
case 'F': conv = 15;
}


message[i/2]= message[i/2] | (conv<< (4*(1-i%2)));
++i;

}
}

for(int i=0 ; i < c ; i ++ ){
std::cout << message[i];
}

memcpy(out,preamble_sync,20*sizeof(char));
memcpy(out+20,message,c*sizeof(char));
return noutput_items;
return -1;

}

} /* namespace Acars_send */
} /* namespace gr */

最佳答案

您的代码有很多问题。很迷茫。

  • 您使用c 作为文件中字符的计数。然后你将它解释为一个带有 toupper[c] 的字符并忽略你刚刚读取的十六进制字符。
  • 您的十六进制转换 switch 语句没有 break,因此始终会导致 conv = 15
  • 你的工作函数必须写不超过 noutput_items,剩下的留着以后用。相反,它想写多少就写多少,可能会溢出提供的缓冲区。

考虑到这里的困惑情况,我强烈建议您先解决较小的问题并更好地掌握这门语言。让您的转换器从十六进制开始工作,只打印结果。制作一个不读取文件的源代码块。

此外,打开 C++ 编译器的警告并听取它们。它可能会告诉您您的 switch 语句已损坏。

关于c++ - Gnu_radio,工作循环和停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44552907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com