FAQs from Rohde & Schwarz

Qual è la struttura dei dati della traccia dell'FSE/FSIQ sul GPIB?

Domanda

Come convertire il risultato della traccia binaria dal GPIB utilizzando il comando 'TRAC? TRACE1' ?

Risposta

Il formato di default dopo *RST è il formato ASCII. Questo significa che si avranno 500

valori ASCII, separati da virgole, in un'unica stringa (ca. 6 Kbyte)

che si conclude con un avanzamento riga (0A hex).

Per utilizzare il formato in virgola mobile è necessario inviare precedentemente il comando "FORMAT REAL,32"

.

L'FSE risponderà alla query "TRAC? TRACE1" con una stringa binaria di 500 valori

float. Ogni valore è nel formato a precisione singola a 4 byte (32 bit) IEEE 754

utilizzato da quasi tutti i compilatori (anche da Visual Basic).

Per questo motivo non deve essere effettuata nessuna conversione, il che consente di risparmiare molto

tempo di elaborazione. Tutti i valori vengono inviati con il byte basso per primo, che corrisponde all'ordine di byte nel

mondo dei PC - per le workstation HP, verificare.

La stringa binaria è formattata secondo i <Definite Length Arbitrary Block

Response Data> come descritto nella norma IEEE 488.2.

Questo formato deve essere utilizzato insieme alle precedenti informazioni sulla lunghezza

se una risposta di uno strumento è in formato binario.

La sintassi di codifica è il segno ASCII # seguito da una cifra diversa da zero. Questa

cifra indica il numero di cifre che seguono e insieme specificano la

lunghezza dell'informazione binaria. Nel caso dell'FSE, l'informazione di

lunghezza che precede è "#42000...", che significa 2000 byte (500 x 4 byte)

di informazione binaria.

L'esempio di programmazione in C qui sotto utilizza un vettore FLOAT a precisione singola per leggere

le informazioni senza alcuna conversione dal bus IEEE. L'informazione di lunghezza

che precede è semplicemente sostituita da un offset di 6 byte nel vettore.

/* DEFINES ****************************************************************/

#define MAX_NOF_POINTS 500 // max. number of points per sweep

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

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

UINT8 sweep_data[MAX_NOF_DATA_BYTES]; // salva i dati caricati provenienti da FSEx

float *sweep_data_ptr= (float *)sweep_data; // pointer to sweep_data

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

int read_sweep_data(void)

/*

SPECIFICATION: leggi nuovi dati provenienti da FSEx

I dati della traccia in formato binario sono 500 valori float (2000 bytes)

preceduti da 6 bytes

utilizzati come uno specificatore di lunghezza (formato IEEE488.2):

#42000...

PARAMETERS: none

SIDE_EFFECTS: none

RETURN VALUES: 0 se effettuato con successo

1 in caso di errori

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

{

if (write_to_analyzer("FORMAT REAL32;:TRAC? TRACE1")) // send data of Trace

1 in binary format

{

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

return 1; // there was an error

}

if (read_from_analyzer(sweep_data, MAX_NOF_DATA_BYTES))

{

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

return 1; // there was an error

}

if ( (ibcnt < 2006) || (ibcnt > 2007) ) // number of received bytes

{

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

return 1; // there was an error

}

sweep_data_ptr= (float *) &sweep_data[6]; // set pointer to data start

return 0;

}