es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué mi bloque personalizado entra dos veces en la función general_work() en GNU Radio?

Estoy creando un bloque personalizado llamado “Combinar” que recibe 20 bytes de datos del primer input. El valor del primer input especifica la cantidad de bytes que se leerán del segundo input, los cuales se escriben en el archivo de salida.

Cada vez que ejecuto el flujo de datos, la impresión muestra que el código entra dos veces en la función general de trabajo. En la primera ocasión lee los datos correctos, pero en la segunda ocasión lee valores falsos y escribe estos datos incorrectos en el sink de salida.

Estoy utilizando las siguientes firmas para el input:

Combine_impl::Combine_impl()
: gr::block(“Combinar”,
gr::io_signature::make(2, 2, sizeof(unsigned char)),
gr::io_signature::make(1, 1, sizeof(unsigned char)))
{}

Creo que mi problema está en la función de pronóstico y en el uso de la función de consumo. He intentado hacer esto en el pronóstico, pero sigue entrando dos veces en la función general de trabajo y escribiendo datos incorrectos al archivo de salida.

ninput_items_required[0] = 20;
ninput_items_required[1] = 7; //porque el primer input tiene un valor de 7 y leerá 7 bytes de datos del segundo input.

¿Alguien puede ayudarme a determinar qué está yendo mal aquí? Además, ¿cómo se supone que se debe utilizar la función consume_each() aquí?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás teniendo está relacionado con el uso de la función consume_each() en la función general work. La función consume_each() debe ser usada antes de copiar los datos del buffer de entrada al buffer de salida, ya que indica cuántas muestras han sido procesadas y deben ser eliminadas del buffer de entrada.

    Aquí hay un ejemplo de cómo usar la función en tu función general_work():

    int Combine_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 unsigned char *in1 = (const unsigned char *) input_items[0];
        const unsigned char *in2 = (const unsigned char *) input_items[1];
        unsigned char *out = (unsigned char *) output_items[0];
     
        int n = ninput_items[0];
     
        int i = 0; // contador para el buffer de entrada 2
        int j = 0; // contador para el buffer de salida
     
        while (n > 0)
        {
            int k = std::min(n, (int) in2[i]); // número de bytes para leer de in2
            std::memcpy(out + j, in2 + i + 1, k); // copiar k bytes de in2 a out
            i += k + 1; // moverse a la siguiente ubicación de entrada
            j += k; // moverse a la siguiente ubicación de salida
            n -= k + 1; // decrementar el número de bytes restantes que se deben leer de in2
            consume_each(k + 1); // eliminar las muestras procesadas del buffer de entrada
        }
     
        return j; // devolver el número de bytes escritos en el buffer de salida
    }
    

    En este ejemplo, la función consume_each() se utiliza para eliminar las muestras procesadas del buffer de entrada después de copiar los datos de in2 a out. El bucle continúa hasta que se han leído y escrito en el archivo de salida todos los bytes especificados por el primer input.

    ¡Espero que esto te ayude a solucionar el problema que estás teniendo con tu bloque personalizado. Déjame saber si tienes alguna pregunta adicional!

Comments are closed.