将示波器中的VISA波形导入Python

时间:2014-12-12 20:53:56

标签: python unicode visa

我对此VISA获取电话的返回结果有疑问:

    ribData = []
    ribData = inst.query('CURVe?')

我正在使用此调用从示波器中获取波形。我正在用Python开发这个程序。

如果值为正,则调用返回二进制值,我可以对它们进行图形化,但如果我将波形放在中间点以下的范围内,则会收到错误:

Traceback (most recent call last):

    File "C:/_Python/TDS3054/mainTds.py", line 107, in cButton
       ribData = inst.query('CURVe?')
    File "C:\Python34\lib\site-packages\pyvisa\resources\messagebased.py", line 384, in query
       return self.read()
    File "C:\Python34\lib\site-packages\pyvisa\resources\messagebased.py", line 309, in read
       message = self.read_raw().decode(enco)
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 401: ordinal not in range(128)

我在采集之前使用以下VISA调用来设置示波器。

    inst.write('DATa:SOUrce CH2')
    inst.write('DATa:WIDth 1')
    inst.write('DATA:START 10')
    inst.write('DATA:STOP 800')
    inst.write('DATa:ENCdg RIBinary')  # RIB -128 to +127

因为,在采集调用(CURVe)上发生了故障,我想知道是否有可用于解决此问题的VISA库调用。也许我需要将Unicode设置为UTF-8,或者VISA可能不会处理Unicodes,或者这可能不是我的问题。

2 个答案:

答案 0 :(得分:1)

最有可能是Unicode问题,但我在pyVisa interface document找到答案。在本文档中,我找到了函数query_binary_values(),并用它替换了inst.Query(' CURVe")。这就是我使用它的方式。

tdsData = inst.query_binary_values('CURVe?', datatype='b', is_big_endian=True)

返回的数据没有UnicodeDecodeError,我能够绘制所有行没有问题。

答案 1 :(得分:0)

请注意,该错误表明它正在使用' ascii'编码。这不是首选,因为我非常确定您的乐器输出的值比编码方法可以处理的范围更广:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 401: ordinal not in range(128)

所以要修复(至少在我的情况下)你可以指定一个不同的编码方法。 首先在python中引用你的乐器,然后将其编码设置为' latin-1'

例如:

inst = rm.open_resource('USB0::0x1AB1::0x0588::DS1ET152915193::INSTR')
inst.encoding =  "latin-1"

然后读取值并将它们转换为标量数组,只需执行以下操作:

data = map(ord, inst.query(":WAVeform:DATA? FFT")) #UTF string to int array conversion

数据现在应该包含所有"全范围"值。