FAQs from Rohde & Schwarz

GPIB 上的 FSE/FSIQ 迹线数据结构是什么?

问题

如何使用“TRAC? TRACE1”命令通过 GPIB 转换二进制迹线结果?

回答

*RST 之后默认采用 ASCII 格式。这就表示,您会在一个字符串(约 6 Kbyte)中

得到 500 个 以逗号分隔的 ASCII 值,

该字符串以换行结束(0A 十六进制)。

要使用浮点格式,您事先要发送“FORMAT REAL,32”

命令。

FSE 将响应查询“TRAC? TRACE1”,并发送一个包含 500 个浮点的

二进制字符串。每个值都使用 IEEE 754 单精度 4 字节(32 位)格式,

几乎所有的编译器(甚至是具有 Visual Basic 的编译器)都使用这种格式。

因此,无需转换,节省了很多的处理

时间。所有值都是按照 PC 中的字节顺序先从最低字节发送,

请参见 HP 工作站了解详细信息。

二进制字符串的格式依据 IEEE 488.2 标准中所述的 <任意块

响应数据的具体长度>。

如果仪器响应使用二进制格式,

则此格式必须与前述的长度信息一起使用。

编码语法是:ASCII 符号数 + 数字(非零)。该

数字表示后接的数字位数,并一起指定了

二进制信息的长度。以 FSE 为例,前面的

长度信息是“#42000...”,这表示二进制信息包含 2000 字节(500 x 4 字节)

下面的 C 编程示例使用单精度浮点型数组来读取信息,

无需 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)

/*

规范:读取 FSEx 的新数据

使用二进制格式的迹线数据是 500 个浮点值(2000 字节),

这些值的前面是作为长度说明符的 6 个字节

(使用 IEEE488.2 格式):

#42000...

参数:无

SIDE_EFFECTS:无

返回值:如成功,则返回 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 &lt; 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;

}