질문
'TRAC? 'TRATRACE1' 명령으로 GPIB의 이진 트레이스 결과를 변환하려면 어떻게 해야 합니까?
'TRAC? 'TRATRACE1' 명령으로 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>에 따라 서식이 지정됩니다.
기기 응답이 이진 형식인 경우 이 형식에서는 선행 길이 정보와 함께 사용해야 합니다.
인코딩 구문은 ASCII 기호 #와 그 다음에 나오는 0이 아닌 숫자입니다.이 숫자는 다음에 나오는 자릿수를 나타내며 함께 이진 정보의 길이를 지정합니다.
FSE의 경우 선행 길이 정보는 2000 바이트(500 x 4바이트)의 이진 정보를 의미하는 "#42000..."입니다.
아래 C 프로그래밍 예제는 IEEE 버스에서 변환하지 않고 정보를 읽는 single-precision FLOAT 배열을 사용합니다.
선행 길이 정보는 배열에서 6바이트 오프셋으로 간단히 건너뜁니다.
/* DEFINES ****************************************************************/
#define MAX_NOF_POINTS 500 // 스윕당 최대 포인트 수
#define MAX_NOF_DATA_BYTES (MAX_NOF_POINTS * sizeof(float) + 100)
/* VARIABLES **************************************************************/
UINT8 sweep_data[MAX_NOF_DATA_BYTES]; // FSEx에서 로드한 데이터 저장
float *sweep_data_ptr= (float *)sweep_data; // 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")) // 트레이스 1 데이터를 이진 형식으로 전송
{
sprintf(error_msg, "IEEE-Error: TRAC? TRACE1");
return 1; // 오류 발생
}
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) ) // 수신된 바이트 수
{
sprintf(error_msg, "IEEE-Error: reading sweep data (incorrect byte count)");
return 1; // there was an error
}
sweep_data_ptr= (float *) &sweep_data[6]; // 데이터 시작에 대한 설정 포인터
return 0;
}