|
我有一个GPIB设备,想要通过多字节读取来进行数据读取。例如,我希望从设备中读取50字节信息(总共),我希望能够单次读取10个字节并通过多次读取来实现。
如果我使用交互式控制(IBIC),我能够调用ibrd 10来以每10个字节一包的方式读取这50个字节的数据,没有出现问题。
但当我试着来LabVIEW中做同样的事情时,第一次读回GPIB数据返回10字节数据,但接下来的子序列的读取都发生了EABO错误,这是由读取超时导致的。
为什么多次读取可以在IBIC中正常但是无法在LabVIEW中正常工作?
这个问题的解答与您的仪器和您在IBIC和LabVIEW中处理多次读取的方式有关。
当你在IBIC中读取仪器信息的时候,只有第一次读取会与设备的地址相关。所有的子序列的读取都会认为仍然和同一个仪器通信,所以接下来的读取不会重新定位地址。只有当您调用其他函数的时候,比如说ibwrt,那么地址会被重新使用。注意您可以通过ibconfig 中的ibcreaddr #配置是否使能重新定位地址,这里#为1是使能,为0则是禁用。 当您在LabVIEW中读取仪器数据的时候,您可能在循环中使用GPIB读取函数。如果仪器的地址是以下描述的方式提供,那么GPIB读取函数会一直通过地址来定位仪器。如果您将GPIB读取函数放置在循环中,那么每次读取都会使用到地址信息,所以LabVIEW每次都会重新定位地址。 这两种方式的区别在于一个会重新定位地址,另一个则不会。当您在寻址一个设备的时候,主要使用的是ibcmd函数来告诉设备是发送还是接收数据。正常情况下,您只需要对设备进行一次寻址就能够确立发送方和接收方,但是有些仪器在每个ibrd和ibwrt都需要这个地址信息。 问题就在这里:当有些设备在重新寻址以后,它们会认为这次通信已经结束,所以在子序列传输时重新寻址就会让它们清空输出缓冲区,那就无法继续读取数据,就会产生超时错误。 解决方案如下:如果您在LabVIEW中第一次GPIB读取时提供了GPIB地址,并在后续子序列读取时让地址字符串输入悬空,直到需要开始另一个传输过程,那么将会迫使LabVIEW避免重新寻址。查看附件中GPIB Readdressing Option 1.vi。 另外一种可选方案是将GPIB初始化函数中“需要重新寻址”输入配置为“False”,这样来禁用重新寻址。这种情况下,您需要在GPIB读取时使用常规寻址。可以查看附件中例程GPIB Readdressing Option 2.vi。
KnowledgeBase 0R0FC772: GPIB Timeout Errors (EABO) after Upgrading to Faster Computers
Developer Zone Example: GPIB Example for LabVIEW
|