источник gnuradio выводит только нули

Я сделал пользовательский исходный блок, который читает значения коммутаторов на zedboard. Это доступ к ним через драйвер proc, который я написал. /Var/log / kern.log-это правильный вывод отчета. Debug printf в исходном блоке сообщает о правильных выходных данных.

Однако передача данных в файловую ссылку, а также приемник номеров 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 readn");
            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 */

1 ответ

  1. Указатель-это указатель на данные, обычно:

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

    out ссылается на буфер для вывода.

    Но вы перезаписываете этот указатель другим указателем:

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

    который просто сгибается вокруг вашей копии этого указателя и не влияет на содержимое этого буфера вообще. Basic C!

    Вы, вероятно, хотели сказать что-то вроде:

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

    Это поместит ваше значение в первый элемент буфера.

    Однако вы говорите GNU Radio, что вы не только произвели один элемент (строка выше), но и noutput_items:

      return noutput_items;
    

    Что должен читать

      return 1;
    

    когда вы производите только один элемент, или вы должны на самом деле производить столько элементов, как вы return.

    Ваш consume_eachвызов бессмыслен – источники Радио GNU обычно являются экземплярамиgr::sync_block, что означает, что вы напишете work()вместо general_work()метода, как вы сделали.

    Из того факта, что это general_workи не workя бы сказал, что вы не использовали gr_modtool(с типом блока, установленным в source!) сгенерировать заглушку для этого блока-действительно стоит. Опять же, я хотел бы указать вам на руководства, которые должны действительно быстро объяснить использованиеgr_modtool, а также основные концепции GNU Radio.