Импорт формы сигнала VISA с осциллографа в Python

У меня возникли проблемы с результатом возврата из этого запроса на приобретение 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 ответа

Скорее всего, это была проблема Unicode, но я нашел ответ в документе интерфейса pyVisa. В этом документе я нашел функцию query_binary_values (), и я заменил inst.Query('CURVe ") на нее. Вот как я ее использовал.

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

Данные, которые были возвращены, не имели UnicodeDecodeError, и я смог построить все строки без проблем.


Обратите внимание, что в этой ошибке указывается, что он использует кодировку 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

данные теперь должны содержать все значения "полного диапазона".

licensed under cc by-sa 3.0 with attribution.