gnuradio源只输出零

时间:2016-05-03 14:51:15

标签: c++ gnuradio

我制作了一个自定义源块,用于读取zedboard上的开关值。它是通过我写的proc驱动程序访问它们的。 /var/log/kern.log报告正确的输出。源块中的调试printf报告正确的输出。

然而,将数据推送到filesink以及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 */

1 个答案:

答案 0 :(得分:0)

指针是指向数据的指针,通常是:

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

out指的是输出的缓冲区。

但是你用另一个指针覆盖那个指针:

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

它只是围绕你指针的副本弯曲,并且根本不会影响该缓冲区的内容。基本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(块类型设置为{{} 1}}!)为这个块生成存根 - 你真的应该。同样,我想指出Guided Tutorials,它应该真正快速地解释source的使用以及基础GNU Radio概念。