2017-06-14 4 views
2

私はgnuradioで始まっています。Gnu_radio、作業のループと停止

私はカスタムブロックを作成しようとしています。私の目標は、txtファイルから16進データを読み込み、プリアンブルで2進数で送信することです。

私は次のコードを試しましたが、作業が終了する前に終了することがあります。ループすることがあります。 変換部分には到達しません。どこかで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 */ 

答えて

1

があります。それは非常に混乱しています。

  • cをファイルの文字数として使用します。次に、それをtoupper[c]の文字として解釈し、読み込んだ16進文字を無視します。
  • あなた進変換switch文はbreak秒を持っていないので、常にconv = 15になります。
  • あなたの仕事関数は超えないnoutput_itemsを書き、後で残りを保存する必要があります。代わりに、提供されているバッファをオーバーフローさせて、必要なだけ多くの文字を書き込んでいます。ここでの混乱を考えると

、私は強く小さい問題最初にあなた作業することをお勧めしますと言語の強力な把握を取得します。結果を印刷するだけで、コンバーターをヘックス作業から得ることができます。ファイルを読み込まないソースブロックを作成します。

また、あなたのC++コンパイラの警告をオンにしし、それらに耳を傾けます。スイッチのステートメントが壊れている可能性があります。

+0

あなたの答えをありがとう!これらの警告は私のコンパイラには表示されませんでした。 最初の2つのエラーを修正しました。 しかし、どのようにしてnoutput_itemsを制御できますか? (noutput_items <(162)) のようなものを追加する場合は、 を返します。 それは、仕事関数が完全に処理できるようになり、コードの初めに (162 iが書き込みたいメッセージの長さですか)?事前 –

+0

で Thxをそれが事故で働く_might_ @CorentinBresteauが、私はすでに言ったように、あなたの仕事関数は、いくつかの項目を生成し、後で残りを保存することができなければなりません。通常は、一度にファイル全体を読み取らないようにしてください。 –

+0

私が読もうとしているファイルは、常に非常に小さくなります。 'noutput'の長さを読み取って、ファイル内の同じ文字数を読み込み、最後に結果を変換後に送信できますか? –

関連する問題