Domanda
Come convertire il risultato della traccia binaria dal GPIB utilizzando il comando 'TRAC? TRACE1' ?
Come convertire il risultato della traccia binaria dal GPIB utilizzando il comando 'TRAC? TRACE1' ?
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;
}