问题
如何使用“TRAC? TRACE1”命令通过 GPIB 转换二进制迹线结果?
如何使用“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 < 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;
}