问题
如何使用“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;
}