1

我对此 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 不处理 Unicode,或者这不是我的问题。

4

2 回答 2

1

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

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

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

于 2014-12-17T18:45:22.727 回答
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

data 现在应该包含所有“全范围”值。

于 2016-05-19T06:30:54.740 回答