Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Gnu_无线电,工作循环和停止_C++_Gnuradio - Fatal编程技术网

C++ Gnu_无线电,工作循环和停止

C++ Gnu_无线电,工作循环和停止,c++,gnuradio,C++,Gnuradio,我从gnuradio开始 我正在尝试创建一个自定义块。我的目标是从一个txt文件中读取十六进制数据,并用带有前导码的二进制文件发送它们 我尝试了以下代码,但工作有时在结束前退出,有时循环。。。 它永远不会到达转换部分。我怀疑我的努普在什么地方出了问题 提前感谢您的帮助!:) #如果定义有配置# #包括“config.h” #恩迪夫 #包括 #包括“acars\u gen\u impl.h” 命名空间gr{ 名称空间Acars_send{ acars_gen::sptr acars_gen::ma

我从gnuradio开始

我正在尝试创建一个自定义块。我的目标是从一个txt文件中读取十六进制数据,并用带有前导码的二进制文件发送它们

我尝试了以下代码,但工作有时在结束前退出,有时循环。。。 它永远不会到达转换部分。我怀疑我的努普在什么地方出了问题

提前感谢您的帮助!:)

#如果定义有配置#
#包括“config.h”
#恩迪夫
#包括
#包括“acars\u gen\u impl.h”
命名空间gr{
名称空间Acars_send{
acars_gen::sptr
acars_gen::make(字符*文件)
{
返回gnuradio::get_initial_sptr
(新acars_gen_impl(文件));
}
/*
*私有构造函数
*/
acars_gen_impl::acars_gen_impl(char*文件)
:gr::sync_块(“acars_gen”,
gr::io_签名::make(0,0,0),
gr::io_签名::make(1,1,sizeof(char)),
前导同步{0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2B,0x2A,0x16,0x16}
/*前导码同步位{1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111,
11111111,11111111,11111111,11111111,11111111,00101011,00101010,00010110,00010110}*/
{
打开(文件);
int ret=myfile.is_open();
printf(“Fichier ouvert%d\n”,ret);
}
/*
*我们的虚拟析构函数。
*/
acars_gen_impl::~acars_gen_impl()
{
myfile.close();
printf(“Fichier fermén”);
}
/* -------------
*沃尔克
-------------*/
int
acars_gen_impl::work(int noutput_项,
gr\u矢量\u常数\u无效\u星型和输入\u项,
gr_矢量_无效_星和输出_项)
{
printf(“首张作品”);
char*out=(char*)输出_项[0];
对于(int i=0;i
  • 使用
    c
    作为文件中的字符计数。然后使用
    toupper[c]
    将其解释为一个字符,并忽略刚刚读取的十六进制字符
  • 十六进制转换
    switch
    语句没有
    break
    s,因此始终会导致
    conv=15
  • 您的工作函数只能写入
    noutput\u项
    ,并将其余项保存到以后。相反,它正在写入任意数量的项,可能会溢出提供的缓冲区
考虑到这里的混乱,我强烈建议您首先处理较小的问题,并更好地掌握该语言。从hex获取转换器,只打印结果。制作一个不读取文件的源代码块


也可以打开C++编译器的警告并听它们。它可能已经告诉你你的开关语句被破坏了。< / P>谢谢你的回答!这些警告没有在我的编译器中显示。我只是修复了两个第一个错误。但是,如果我添加了一些类似的东西,我如何控制NUTPutsIn项?(努特)_items@CorentinBresteau它可能是偶然工作的,但正如我已经说过的,您的工作函数必须能够生成一些项,并将其余项保存到以后。您通常不会一次读取整个文件来完成此操作。我尝试读取的文件总是非常小的。我可以读取“noutput”的长度,然后读取相同的n文件中的字符数,并在转换后最终发送结果?@corentibresteau如果您只发送短消息,则不需要制作自定义块。只需读取文件,转换它,然后将数据放入

gr::blocks::vector\u source\b
#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 */