Вопрос
Как конвертировать двоичный результат по кривой из шины GPIB с помощью команды 'TRAC? TRACE1'?
Как конвертировать двоичный результат по кривой из шины 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 < 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;
}