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
执行期间无法检查错误。如果我这样做,它可能会产生错误...:]
正如标题所说...
我想查看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
执行期间无法检查错误。如果我这样做,它可能会产生错误...:]