1

正如标题所说...

我想检查通过GPIB连接的设备的SBR寄存器。我有兴趣阅读 MAV 位 4,如果仪器有要发送给我的东西,应该设置它。

问题是,为了检查SBR,我不可避免地必须发送另一个查询(*STB?),默认情况下会清除设备输出缓冲区。换句话说,每当我检查是否有要阅读的内容时,我只是通过查看将其删除。这是重现它的代码,问题出在最后一次调用fscanf()

>> fid = gpib('agilent', 7, 26);
>> fopen(fid)
>> fprintf(fid, '*SRE 255; *SRE?') % Enable everything in SBR
>> fscanf(fid) % Returns +191 as expected (255 - 64 for MSS)

>> fprintf(fid, '*IDN?') % Make any query...
>> fprintf(fid, '*STB?') % Read SBR
   % The line above generates device Query Error (beep)

>> fscanf(fid) % << Returns +0 !!!

>> fclose(fid) % Just to prevent flames :]

我怀疑,有一些方法可以在不查询设备的情况下检查 SBR,但我找不到任何东西。VISA 驱动程序的 MATLAB 帮助没有提及直接与驱动程序或总线通信的主题。

我也尝试检查BusManagementStatus无济于事。

作为参考,我使用MATLAB R2011b的是 32 位Agilent VISA驱动程序,支持 GPIB 的设备是Agilent E4980A LCR Meter. 谢谢你的帮助。

4

1 回答 1

0

好的,我想我想通了。如果我错了,请纠正我...

首先,我需要预测是否需要检查可用消息,因为在我的解决方案中,我将无法检查在SBR中设置的错误队列、主摘要和其他位。

然后,在我的实际命令(可能会产生一些输出)之前,我需要屏蔽服务请求启用寄存器 (SRER)以仅允许 MAV 位。就是这样完成的(根据有问题的示例):

>> fprintf(fid, '*SRE 16');
>> fprintf(fid, '...ACTUAL COMMANDS THAT ARE TO BE EXECUTED...');

现在我可以使用上述BusManagementStatus命令检查设备是否发送服务请求。如果 SBR 中设置了 MAV 位,则以下命令返回 true。

>> strcmp(fid.BusManagementStatus.ServiceRequest, 'on')

ACTUAL COMMANDS缺点是在我的执行过程中没有办法检查错误。如果我这样做,它可能会产生错误... :]

于 2017-05-03T12:47:59.593 回答