2016-05-03 13 views
0

Ich habe einen benutzerdefinierten Quellblock erstellt, der die Schalterwerte auf einem Zedboard liest. Es greift auf sie über einen Proc-Treiber zu, den ich geschrieben habe. Das Verzeichnis /var/log/kern.log meldet die korrekte Ausgabe. Das Debug-Printf im Quellblock meldet die korrekte Ausgabe.gnuradio Quelle gibt nur Nullen aus

Das Verschieben der Daten in einen Filesink sowie eine GUI-Senke liest jedoch nur Nullen. Habe ich den Block nicht richtig eingerichtet?

#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 */ 

Antwort

0

Ein Zeiger ist ein Zeiger auf Daten, in der Regel:

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

out für die Ausgabe an den Puffer Bezug nimmt.

Aber Sie überschreiben, die Zeiger mit einem anderen Zeiger:

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

, die sich um Ihre Kopie dieses Zeigers gerade biegt, und hat keinen Einfluss auf den Inhalt dieser überhaupt Puffer. Grundlegende C!

Sie wahrscheinlich so etwas wie sagen wollte:

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

Das Ihren Wert in das erste Element des Puffers gesetzt wird.

jedoch sagen Sie GNU Radio, dass Sie nicht nur ein einzelnes Element hergestellt (die Linie oben), aber noutput_items:

return noutput_items; 

Das must

return 1; 

lesen, wenn du bist produziert nur einen einzigen Artikel, oder Sie müssen tatsächlich so viele Artikel wie Sie return produzieren.

Ihr consume_each Anruf ist unsinnig - GNU Radioquellen typischerweise Instanzen gr::sync_block, sind, was bedeutet, dass Sie eine work() anstelle eines general_work() Methode schreiben würde wie Sie. (! Mit Set Blocktyp source)

Aus der Tatsache allein, dass dies ein general_work und keine work ich Sie nicht gr_modtool verwendet würde sagen, den Stummel für diesen Block erzeugen - Sie sollen wirklich. Nochmals, ich möchte Sie auf die Guided Tutorials hinweisen, die die Verwendung von gr_modtool sowie die zugrunde liegenden GNU Radio-Konzepte sehr schnell erklären sollte.

+0

Vielen Dank werde ich durchgehen. Ich habe einen allgemeinen Block von gr_modtool gemacht, anstatt Quelle anzugeben ... Ich folgte der Anleitung beim Erstellen des ff_square Blocks, aber es hat mich nicht wirklich darauf vorbereitet, dies zu sehr zu erstellen. Ich habe mit dieser Quelle und einer anderen Senke für eine Weile gekämpft. Danke für die Eingabe! – gutelfuldead

+0

yeah, das 'square_ff' Beispiel könnte eines der Dinge sein, die ich nicht wirklich mag über das GNU Radio Wiki. Wirklich, die geführten Tutorials sind besser geeignet, um Ihnen ein gutes Intro zu geben! :) –

Verwandte Themen