質問
'TRAC? TRACE1' コマンドを使用してGPIBからのバイナリ・トレース結果を変換するにはどうすればよいですか?
'TRAC? TRACE1' コマンドを使用してGPIBからのバイナリ・トレース結果を変換するにはどうすればよいですか?
*RST後のデフォルトのフォーマットは、ASCIIフォーマットです。つまり、カンマで区切られた
500個のASCII値が、改行(16進数の0A)で終わる
1つの文字列として返されます(約6 Kバイト)。
浮動小数点フォーマットを使用するには、"FORMAT REAL,32" コマンドを事前に
送信する必要があります。
FSEは、"TRAC? TRACE1" 問合せに対して、500個の浮動小数点値からなるバイナリ・ストリングで
答えを返します。各値は、IEEE 754単精度4バイト(32ビット)フォーマットです。
このフォーマットは、ほとんどすべてのコンパイラで(Visual Basicでも)使用されます。
このため、変換を実行する必要がなく、処理時間を大幅に
削減できます。値はすべて、下位バイトが最初に送信されます。これは、PCの世界における
バイト順序です。HPのワークステーションについては、ご確認ください。
バイナリ・ストリングは、IEEE 488.2規格で定義されている
<固定長任意ブロック応答データ>に従ってフォーマットされます。
このフォーマットは、測定器の応答がバイナリ・フォーマットの場合は、
先行する長さ情報と組み合わせて使用する必要があります。
エンコード構文では、ASCII符号の#の後に非ゼロの桁が続きます。この
桁は、続く桁数を示すと同時に、バイナリ情報の
長さを指定します。FSEの場合、先行する
長さ情報は "#42000..." で、2000バイト(500×4バイト)の
バイナリ情報であること意味します。
以下のCプログラミングの例では、単精度FLOAT型配列を使用して、
IEEEバスからの情報を変換なしに読み取ります。先行する長さ
情報は、6バイト単位のオフセットで配列内をスキップされます。
/* 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;
}