一些仪器允许传输在一次询问中传输大数据片。典型例子是示波器,可以传输整个电压波形。或者波形发生器,可以传输需要产生的整个波形数据。像这样的数据传输有两种方法:ASCII方式(慢,可读)或者二进制(快,难于调试)。PyVisa提供了这两种传输方式:pyvisa.resources.MessageBasedResource.query_ascii_values() 和 pyvisa.resources.MessageBasedResource.query_binary_values()。在预先设置好的情况下,可以使用pyvisa.resources.MessageBasedResource.query_values()。
如果示波器配置成二级制格式,相应”CURV?“命令传输二进制数据,可以这样获取数据:
|
values是包含波形信息的数据列表。
很多情况下,不希望是列表类型,而是不同的容器类型,比如numpy.array;可以这样处理数据:
|
有时候避免中间列表是有效的,在这种情况下可以在query方法中定义容器。
|
在容器中,可以调用任何可迭代的类型。
一些仪器的二进制数据编码不是十进制而是16进制或8进制,后者需要接收字符串类型,这些情况下可以设置converter。例如,接收16进制整形:
|
converter是python数据类型编码(https://docs.python.org/3/library/string.html#formatspec)的一种。但是如果需要,可以设置一个参数,默认converter是”f“。
最后,有些设备返回特殊间隔的数据。比如,返回数据间隔符号是”$“,可以这样调用:
|
可以创建函数接收字符串,转化为iterable类型,默认的间隔符是逗号”,“。
如果示波器设置成响应”CURV?“命令返回二进制数据,需要确认数据类型(uint8,int8,single,double等)。PyVISA采用类似struct module命名转换(https://docs.python.org/3/library/struct.html#format-characters)。还需要确认大小端,PyVISA默认按小端,如大端double类型d:
|
还可以跟前面一样,设置不同的cotainer。
默认,PyVISA按照IEEE转换格式设置数据。如果设备支持HP数据格式,可以设置参数header_fmt='hp'给
read_binary_values;如果设备不用任何头,直接设置
header_fmt='empty'。
根据PyVISA默认设置,设备将增加结束字符表征数据块的结束,以保证读取正确。一些仪器做了很好的设置,也有些仪器忽略了结束字符,这种情况下读取操作将产生超时。这种情况下,首先确认通过read_raw函数读取仪器,检查数据长度是否匹配仪器。如果这样,需要设置expect_termination=False,PyVISA将不检查结束字符。
更新波形发生器的波形数据,可以使用命令WLISt:WAVeform:DATA
|
并且也可以使用converter代码。
|
converter可以是任何一种Python字符串类型。也可以自定义一个单字符表示的字符串类型。默认converter是‘f’。
间隔符也可以在query_ascii_values中定义。
|
也可以定义返回字符串的迭代器。默认间隔符是“,”。
更新波形发生器的波形数据,可以使用命令WLISt:WAVeform:DATA
|
还可以自定义datatype和endianness。
|
PyVisa提供了简单的传输数据到设备的方法。以上描述的方法能够解决99%的情况,但仍有一些特殊的设备不遵循标准的协议,所以不适用前面的连接设备的方法。
在这些情况下,可以采用如下方式。
|
然后,你可以编写逻辑处理数据。
如果read_raw调用返回错误,可以试试读几个bytes。
|
如果还是错误,可能是需要等待更长时间,或者指令没有被正确解析。