Frage
Wie wird das binäre Messkurvenergebnis vom GPIB mit dem Befehl 'TRAC? TRACE1' konvertiert?
Wie wird das binäre Messkurvenergebnis vom GPIB mit dem Befehl 'TRAC? TRACE1' konvertiert?
Das Standardformat nach *RST ist das ASCII-Format. Das heißt, Sie erhalten 500
ASCII-Werte, die durch Kommas getrennt sind, in einer einzigen Zeichenkette (ca. 6 Kbyte),
die durch ein Zeilenvorschubzeichen (0A hex) abgeschlossen ist.
Um das Gleitkommaformat zu verwenden, müssen Sie vorher den Befehl "FORMAT REAL,32"
senden.
Der FSE beantwortet die Abfrage "TRAC? TRACE1" mit einer binären Zeichenkette aus 500
Gleitkommawerten. Jeder Wert hat das einfach genaue 4-Byte-(32-Bit-)Format gemäß IEEE 754,
das von fast allen Compilern verwendet wird (sogar mit Visual Basic).
Deshalb ist keine Konvertierung erforderlich, was viel Verarbeitungszeit
einspart. Alle Werte werden mit dem niederwertigsten Byte zuerst gesendet, was der
Bytereihenfolge in der PC-Welt entspricht - bei HP-Workstations bitte prüfen.
Die binäre Zeichenkette ist gemäß den <Definite Length Arbitrary Block
Response Data>, so wie in der Norm IEEE 488.2 beschrieben, formatiert.
Dieses Format muss zusammen mit den vorhergehenden Längeninformationen
verwendet werden, wenn eine Geräteantwort ein binäres Format hat.
Die Codierungssyntax ist das ASCII-Zeichen #, gefolgt von einer Ziffer ungleich null. Die
Ziffer gibt die Anzahl der nachfolgenden Ziffern an; zusammen geben sie
die Länge der binären Information an. Beim FSE lautet die vorhergehende
Längeninformation "#42000...", was 2000 Bytes (500 x 4 Bytes) an
binären Informationen entspricht.
Im folgenden C-Programmierbeispiel wird ein einfach genaues FLOAT-Array zum Lesen
der Informationen ohne Konvertierung vom IEEE-Bus verwendet. Die vorhergehende
Längeninformation wird einfach durch ein 6-Byte-Offset im Array übersprungen.
/* 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]; // stores the data loaded from FSEx
float *sweep_data_ptr= (float *)sweep_data; // pointer to sweep_data
/* 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")) // 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;
}