FAQs from Rohde & Schwarz

¿Cuál es la estructura de los datos de traza FSE/FSIQ en el GPIB?

Pregunta

¿Cómo se convierten los resultados de traza binarios del GPIB utilizando el comando "TRAC? TRACE1"?

Respuesta

El formato por defecto después de *RST es el formato ASCII. Esto significa que obtendrá 500

valores ASCII, separados por comas, en una única cadena (aprox. 6 Kbytes)

terminada en un cambio de línea (0A hex).

Para utilizar el formato en coma flotante debe enviar el comando "FORMAT REAL,32"

previamente.

El FSE responderá a la consulta "TRAC? TRACE1" con una cadena binaria de 500

valores flotantes. Cada valor está en el formato IEEE 754 de precisión simple de 4 bytes (32 bits)

que utilizan casi todos los compiladores (incluso con Visual Basic).

Por lo tanto, no es necesario realizar ninguna conversión, con lo que se ahorra mucho tiempo de procesamiento.

Todos los valores se envían primero con el byte bajo, que es el orden de bytes en el

PC (comprobar para estaciones de trabajo HP).

La cadena binaria está formateada conforme al <Definite Length Arbitrary Block

Response Data> descrito en el estándar IEEE 488.2.

Este formato debe utilizarse junto con la información de longitud precedente

si la respuesta de un instrumento está en formato binario.

La sintaxis de codificación es el signo de ASCII # seguido de un dígito distinto de cero. Este

dígito indica el número de dígitos que siguen y juntos especifican la

longitud de la información binaria. En el caso del FSE, la

información de longitud precedente es "#42000...", que corresponde a 2000 bytes (500 x 4 bytes) de

información binaria.

El ejemplo de programación en C que se recoge a continuación utiliza un array flotante de precisión simple para leer

la información sin que se realice conversión alguna por parte del bus IEEE. La información de la longitud precedente

simplemente se omite mediante un offset de 6 bytes en el array.

/* DEFINE ****************************************************************/

#define MAX_NOF_POINTS 500 // número máximo de puntos por barrido

#define MAX_NOF_DATA_BYTES (MAX_NOF_POINTS * sizeof(float) + 100)

/* VARIABLES **************************************************************/

UINT8 sweep_data[MAX_NOF_DATA_BYTES]; // guarda los datos cargados desde el FSEx

float *sweep_data_ptr= (float *)sweep_data; // puntero a datos de barrido

/* Procedures **************************************************************/

int read_sweep_data(void)

/*

SPECIFICATION: read new data from FSEx

Trace data in binary format are 500 float values (2000 bytes)

preceded by 6 bytes

which are used as a length specifier (IEEE488.2 format):

#42000...

PARAMETERS: none

SIDE_EFFECTS: none

RETURN VALUES: 0 if successful

1 if there was any error

****************************************************************************/

{

if (write_to_analyzer("FORMAT REAL32;:TRAC? TRACE1")) // enviar datos de traza

1 in binary format

{

sprintf(error_msg, "IEEE-Error: TRAC? TRACE1");

return 1; // ha habido un error

}

if (read_from_analyzer(sweep_data, MAX_NOF_DATA_BYTES))

{

sprintf(error_msg, "IEEE-Error: reading sweep data");

return 1; // ha habido un error

}

if ( (ibcnt < 2006) || (ibcnt > 2007) ) // número de bytes recibidos

{

sprintf(error_msg, "IEEE-Error: reading sweep data (incorrect byte count)");

return 1; // ha habido un error

}

sweep_data_ptr= (float *) &sweep_data[6]; // poner puntero en inicio de datos

return 0;

}