FAQs from Rohde & Schwarz

GPIB에서 FSE/FSIQ 트레이스 데이터의 구조

질문

'TRAC? TRACE1' 명령으로 GPIB의 이진 트레이스 결과를 변환하려면 어떻게 해야 합니까?

답변

*RST 다음의 기본 형식은 ASCII 형식입니다. 즉, 줄 바꿈으로 종료되는 단일 문자열에 쉼표로 구분된 ASCII 값 500개(약 6 Kbyte)가 포함됩니다(0A 16진수).

부동 소수점 형식을 사용하려면 미리 "FORMAT REAL,32" 명령을 전송해야 합니다.

FSE는 500개의 부동 소수점 값으로 된 이진 문자열을 사용하여 "TRAC? TRACE1" 쿼리에 응답합니다.

각 값은 거의 모든 컴파일러(Visual Basic 포함)에서 사용하는 IEEE 754 단정밀도 4바이트(32비트) 형식에 있습니다.

따라서 변환을 수행하지 않아도 되므로 많은 처리 시간을 절감할 수 있습니다.

모든 값은 PC와 같은 방식으로 우선 하위 바이트로 전송됩니다. HP 워크스테이션에서는 확인이 필요합니다.

이진 문자열은 IEEE 488.2 표준에 지정된 <Definite Length Arbitrary Block Response Data>에 따라 서식이 지정됩니다.

기기 응답이 이진 형식인 경우 이 형식에서는 선행 길이 정보와 함께 사용해야 합니다.

인코딩 구문은 0이 아닌 숫자 다음에 오는 ASCII 기호 #입니다.

인코딩 구문은 0이 아닌 숫자 다음에 오는 ASCII 기호 #입니다.이 숫자는 다음에 나오는 자릿수를 나타내며 이진 정보의 길이를 지정합니다.

FSE의 경우 선행 길이 정보는 2000 바이트(500 x 4바이트)의 이진 정보를 의미하는 "#42000..."입니다.

아래 C 프로그래밍 예제는 IEEE 버스에서 변환하지 않고 정보를 읽는 단정밀 FLOAT 배열을 사용합니다.

선행 길이 정보는 배열에서 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: FSEx에서 새 데이터 읽기

이진 형식의 트레이스 데이터는 길이 지정자로 사용되는 (IEEE488.2 형식) 6바이트 앞의 500 부동 소수점 값 (2000 바이트)입니다.

#42000...

PARAMETERS: 없음

SIDE_EFFECTS: 없음

RETURN VALUES: 성공할 경우 0

오류가 있는 경우 1

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

{

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;

}