Pregunta
¿Cómo se convierten los resultados de traza binarios del GPIB utilizando el comando "TRAC? TRACE1"?
¿Cómo se convierten los resultados de traza binarios del GPIB utilizando el comando "TRAC? TRACE1"?
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;
}