Matlab GPIB - 如何从状态字节寄存器读取 Message AVailable?

Matlab GPIB - how to read Message AVailable from Status Byte Register?

正如标题所说...

我想查看SBR register of device connected over GPIB。我有兴趣阅读 MAV 位 4,如果仪器有东西要发送给我,应该设置它。

问题是,为了检查 SBR, I inevitably have to send another query (*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 drivers 的 MATLAB 帮助没有提及直接与 driver 或总线通信的主题。

我也尝试检查 BusManagementStatus 但没有成功。

作为参考,我使用的是 MATLAB R2011b,32 位 Agilent VISA drivers,支持 GPIB 的设备是 Agilent E4980A LCR Meter。感谢您的帮助。

好的,我想我明白了。如有不妥请指正...

首先,我需要预料到需要检查可用消息,因为在我的解决方案中,我无法检查 [=14] 中设置的错误队列、主摘要和其他位=].

然后,在我执行实际命令(可能会产生一些输出)之前,我需要屏蔽 Service Request Enable Register (SRER) 以仅允许 MAV 位。这样做是这样的(根据有问题的例子):

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

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

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

缺点是在我的ACTUAL COMMANDS执行期间无法检查错误。如果我这样做,它可能会产生错误...:]