一些仪器允许传输在一次询问中传输大数据片。典型例子是示波器,可以传输整个电压波形。或者波形发生器,可以传输需要产生的整个波形数据。像这样的数据传输有两种方法:ASCII方式(慢,可读)或者二进制(快,难于调试)。PyVisa提供了这两种传输方式:pyvisa.resources.MessageBasedResource.query_ascii_values() 和 pyvisa.resources.MessageBasedResource.query_binary_values()。在预先设置好的情况下,可以使用pyvisa.resources.MessageBasedResource.query_values()。

读ASCII数据

如果示波器配置成二级制格式,相应”CURV?“命令传输二进制数据,可以这样获取数据:

>>> values = inst.query_ascii_values('CURV?')

values是包含波形信息的数据列表。

很多情况下,不希望是列表类型,而是不同的容器类型,比如numpy.array;可以这样处理数据:

>>> values = np.array(inst.query_ascii_values('CURV?'))

有时候避免中间列表是有效的,在这种情况下可以在query方法中定义容器。

>>> values = inst.query_ascii_values('CURV?', container=numpy.array)

在容器中,可以调用任何可迭代的类型。

一些仪器的二进制数据编码不是十进制而是16进制或8进制,后者需要接收字符串类型,这些情况下可以设置converter。例如,接收16进制整形:

>>> values = inst.query_ascii_values('CURV?', converter='x')

converter是python数据类型编码(https://docs.python.org/3/library/string.html#formatspec)的一种。但是如果需要,可以设置一个参数,默认converter是”f“。

最后,有些设备返回特殊间隔的数据。比如,返回数据间隔符号是”$“,可以这样调用:

>>> values = inst.query_ascii_values('CURV?', separator='$')

可以创建函数接收字符串,转化为iterable类型,默认的间隔符是逗号”,“。

读二进制数据

如果示波器设置成响应”CURV?“命令返回二进制数据,需要确认数据类型(uint8,int8,single,double等)。PyVISA采用类似struct module命名转换(https://docs.python.org/3/library/struct.html#format-characters)。还需要确认大小端,PyVISA默认按小端,如大端double类型d:

values = inst.query_binary_values('CURV?', datatype='d', is_big_endian=True)

还可以跟前面一样,设置不同的cotainer。

默认,PyVISA按照IEEE转换格式设置数据。如果设备支持HP数据格式,可以设置参数header_fmt='hp'给read_binary_values;如果设备不用任何头,直接设置header_fmt='empty'。

根据PyVISA默认设置,设备将增加结束字符表征数据块的结束,以保证读取正确。一些仪器做了很好的设置,也有些仪器忽略了结束字符,这种情况下读取操作将产生超时。这种情况下,首先确认通过read_raw函数读取仪器,检查数据长度是否匹配仪器。如果这样,需要设置expect_termination=False,PyVISA将不检查结束字符。

写ASCII数据

更新波形发生器的波形数据,可以使用命令WLISt:WAVeform:DATA <waveform name>,<function data>,其中<waveform name>是存放数据的参数名。

>>> values = list(range(100))

>>> inst.write_ascii_values('WLISt:WAVeform:DATA somename,', values)

并且也可以使用converter代码。

>>> inst.write_ascii_values('WLISt:WAVeform:DATA somename,', values, converter='x')

converter可以是任何一种Python字符串类型。也可以自定义一个单字符表示的字符串类型。默认converter是‘f’。

间隔符也可以在query_ascii_values中定义。

>>> inst.write_ascii_values('WLISt:WAVeform:DATA somename,', values, converter='x', separator='$')

也可以定义返回字符串的迭代器。默认间隔符是“,”。

写二进制数据

更新波形发生器的波形数据,可以使用命令WLISt:WAVeform:DATA <waveform name>,<function data>,其中<waveform name>是存放数据的参数名。

>>> values = list(range(100))

>>> inst.write_binary_values('WLISt:WAVeform:DATA somename,', values)

还可以自定义datatype和endianness。

>>> inst.write_binary_values('WLISt:WAVeform:DATA somename,', values, datatype='d', is_big_endian=False)

调试代码(当事情不是应该的样子)

PyVisa提供了简单的传输数据到设备的方法。以上描述的方法能够解决99%的情况,但仍有一些特殊的设备不遵循标准的协议,所以不适用前面的连接设备的方法。

在这些情况下,可以采用如下方式。

>>> inst.write('CURV?')

>>> data = inst.read_raw()

然后,你可以编写逻辑处理数据。

如果read_raw调用返回错误,可以试试读几个bytes。

>>> inst.write('CURV?')

>>> data = inst.read_bytes(1)

如果还是错误,可能是需要等待更长时间,或者指令没有被正确解析。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐