2016-05-03 9 views
0

zedboardでスイッチ値を読み取っているカスタムソースブロックを作成しました。私が書いたprocドライバを使ってそれらにアクセスしています。 /var/log/kern.logが適切な出力を報告しています。ソースブロックのデバッグprintfが適切な出力を報告しています。gnuradioソースのみに0を出力する

ただし、ファイルシンクだけでなくGUI番号シンクにもデータをプッシュすると、ゼロが読み取られます。ブロックを適切にセットアップしていませんか?

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

#include <gnuradio/io_signature.h> 
#include "switches_impl.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <uinstd.h> 

namespace gr { 
    namespace zedboard { 

    switches::sptr 
    switches::make() 
    { 
     return gnuradio::get_initial_sptr 
     (new switches_impl()); 
    } 

    /* 
    * The private constructor 
    */ 
    switches_impl::switches_impl() 
     : gr::block("switches", 
      gr::io_signature::make(0,0,0), 
       gr::io_signature::make(1, 1, sizeof(unsigned int *))) 
    {} 

    /* 
    * Our virtual destructor. 
    */ 
    switches_impl::~switches_impl() 
    { 
    } 

    void 
    switches_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) 
    { 
     /* <+forecast+> e.g. ninput_items_required[0] = noutput_items */ 
    } 

    int 
    switches_impl::general_work (int noutput_items, 
         gr_vector_int &ninput_items, 
         gr_vector_const_void_star &input_items, 
         gr_vector_void_star &output_items) 
    { 
     //const <+ITYPE+> *in = (const <+ITYPE+> *) input_items[0]; 
     unsigned int *out = (unsigned int *) output_items[0]; 

     // Do <+signal processing+> 
     // Tell runtime system how many input items we consumed on 
     // each input stream. 

     char buffer[5]; 
     size_t size = 1; 
     size_t nitems = 5; 
     FILE* fp; 

     fp = fopen("/proc/zedSwitches","r"); 
     if (fp == NULL) 
     { 
      printf("Cannot open for read\n"); 
      return -1; 
     } 
     /* 
     Expect return format: 
     0x00 
     */ 
     fread(buffer, size, nitems, fp); 
     fclose(fp); 
     out=(unsigned int *)strtoul(buffer,NULL,0); 
     printf("read: 0x%02x",out); 

     consume_each (noutput_items); 

     // Tell runtime system how many output items we produced. 
     return noutput_items; 
    } 

    } /* namespace zedboard */ 
} /* namespace gr */ 

答えて

0

ポインタは、通常、データへのポインタである:

unsigned int *out = (unsigned int *) output_items[0]; 

outは、出力のためのバッファを指します。

しかし、あなたは別のポインタでそのポインタを上書き:

out=(unsigned int *)strtoul(buffer,NULL,0); 

ちょうどそのポインタのコピーの周りに曲がると、全くそのバッファの内容には影響を与えません。基本的なC!バッファの最初の要素にあなたの価値を置く

out[0]= strtoul(buffer,NULL,0); 

は、おそらくのようなものを言うことを意味しました。

しかし、あなたは、単一の項目(上の行)を生成したがnoutput_itemsだけでなく、GNUラジオを教えて:

return noutput_items; 

をあなたがいるとき

return 1; 

を読まなければならないこと1つのアイテムのみを作成するか、実際にはreturnと同じ数のアイテムを作成する必要があります。

あなたconsume_each呼び出しは無意味である - GNU電波源は、一般的にgr::sync_blockのインスタンスである、あなたが行ったようにあなたの代わりにgeneral_work()方法のwork()を書きたいことを意味しています。これはgeneral_workないworkであることだけで事実から

私はあなたが(sourceに設定するブロックタイプで!)gr_modtoolを使用していないが、このブロックのためのスタブを生成するために言うだろう - あなたが本当に必要があります。ここでもまた、Guided Tutorialsを指摘します。これは、gr_modtoolの使用法と基礎となるGNUラジオの概念をすばやく説明する必要があります。

+0

ありがとう、私はこれを通過します。私はソースを指定するのではなく、gr_modtoolから一般的なブロックを作りました...私はff_squareブロックを作成する際のガイドラインに従っていましたが、これをあまりにも多く作成するための準備は本当にありませんでした。私はしばらくこのソースと別のシンクに苦労してきました。入力いただきありがとうございます! – gutelfuldead

+0

ええ、 'square_ff'の例は、私がGNU Radio wikiについて本当に好きでないものの1つかもしれません。本当に、ガイド付きのチュートリアルはあなたに良いイントロを与えるのに適しています! :) –

関連する問題