FAQs from Rohde & Schwarz

Welche Struktur haben FSE/FSIQ-Messkurvendaten auf dem GPIB?

Frage

Wie wird das binäre Messkurvenergebnis vom GPIB mit dem Befehl 'TRAC? TRACE1' konvertiert?

Antwort

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;

}