FAQs from Rohde & Schwarz

Какую структуру имеют данные кривой FSE/FSIQ на шине GPIB?

Вопрос

Как конвертировать двоичный результат по кривой из шины GPIB с помощью команды 'TRAC? TRACE1'?

Ответ

Форматом по умолчанию после *RST является ASCII. Это означает, что вы получите 500

значений ASCII, которые разделяются запятыми, в одной строке (размером примерно 6 Кбайт),

которая оканчивается символом перевода строки (шестнадцатиричным кодом 0A).

Чтобы использовать формат с плавающей запятой, необходимо отправить команду "FORMAT REAL,32"

заранее.

FSE в ответ на запрос "TRAC? TRACE1" отправит двоичную строку с 500 значениями

плавающего типа. Каждое значение имеет 4-байтовый (32-битный) формат IEEE 754 с одинарной точностью,

и этот формат используется почти всеми компиляторами (даже Visual Basic).

В связи с этим нет необходимости в каком-либо преобразовании, что экономит

большое количество времени, затрачиваемое на обработку. Все значения отправляются с первым младшим байтом, и этот порядок битов

является стандартом в мире ПК, в том числе для рабочих станций HP; вы сами можете в этом убедиться.

Двоичная строка составляется в соответствии с форматом <Definite Length Arbitrary Block

Response Data> (Ответные данные блока определенной длины), который описан в стандарте IEEE 488.2.

Этот формат должен использоваться совместно с предшествующей информацией по объему,

если ответ от прибора приходит в двоичном формате.

Синтаксис кодирования заключается в ASCII-символе, после которого следует цифра, отличная от нуля. Эта

цифра указывает количество последующих цифр, которые составляют число, равное

объему двоичной информации. В случае FSE предшествующая

информация по объему имеет вид "#42000...", что означает 2000 байтов (500 x 4 байта)

двоичной информации.

В приведенном ниже примере программы на языке C используется массив FLOAT одинарной точности для считывания

информации от шины IEEE без какого-либо преобразования. Предшествующая информация

по объему просто пропускается смещением в массиве на 6 байт.

/* Определения ****************************************************************/

#define MAX_NOF_POINTS 500 // макс. кол-во точек в одной развертке

#define MAX_NOF_DATA_BYTES (MAX_NOF_POINTS * sizeof(float) + 100)

/* Переменные **************************************************************/

UINT8 sweep_data[MAX_NOF_DATA_BYTES]; // сохранение данных, загружаемых из FSEx

float *sweep_data_ptr= (float *)sweep_data; // указатель на sweep_data

/* Процедуры **************************************************************/

int read_sweep_data(void)

/*

Спецификация: считывание новых данных из FSEx

Данные кривой в двоичном формате: 500 значений плавающего типа (2000 байтов) с

предшествующими 6 байтами,

которые используются как указатель объема (формат IEEE488.2):

#42000...

Параметры: отсутствуют

Побочные эффекты: нет

Возвращаемые значения: 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; // возникла ошибка

}

if ( (ibcnt &lt; 2006) || (ibcnt > 2007) ) // количество принятых байтов

{

sprintf(error_msg, "IEEE-Error: reading sweep data (incorrect byte count)");

return 1; // возникла ошибка

}

sweep_data_ptr= (float *) &sweep_data[6]; // установка указателя на начало данных

return 0;

}