Я хотел бы получить двоичные данные от прибора (SR620) с помощью RS-232. Данные представляют собой гистограмму, состоящую из 250 ячеек. Программа Python, которую я создал, работает хорошо, когда данные не собираются (я получаю 250 нулей), но как только я начинаю измерение, выходные данные становятся странными, и я не могу их использовать. Я объясню сбор данных, структуру двоичных данных и дам краткую версию программы со всеми соответствующими элементами. Затем я описываю вывод, полученную ошибку и способы устранения неполадок.
Мои вопросы:
- есть ли другие команды, которые я мог бы/должен использовать для получения двоичных данных?
- связано ли это с другими командами, алгоритмом, устройством и т. д.?
< li>Откуда проблема, программа, само устройство?
Подключаюсь к преобразователю время-амплитуда (TAC) SR620 с помощью модуля pyvisa на Python. Могу правильно настроить прибор (установить значения параметров, режим измерения...). Соответственно меняется все на передней панели. Я подключаюсь с помощью этого
Код: Выделить всё
rm = pyvisa.ResourceManager()
## Connecting to counter
TAC = rm.open_resource(self.TAC_address,
baud_rate = 19200,
data_bits = 8,
stop_bits = StopBits(20),
parity = Parity(0))
Структура данных
Чтобы получить гистограмму в двоичном формате, я использую специальную команду XHST. В документации говорится
Код: Выделить всё
XHST? j
The XHST? query returns section j (j=0 to 9) of the
histogram display as 4 byte binary integers least
significant byte first. Each section consists of the
data for 25 histogram points (100 bytes total plus
terminator). There is no separator between
successive points.
If the rs232 interface is being
used an 8 bit data word must be chosen to
correctly transmit this data. The data returned is
binned into 250 bins- not the number set by the
front panel. This command allows one to rapidly
read the entire contents of the histogram display. If
the histogram is blank the illegal numbars -0 are
returned.
Код: Выделить всё
\r\n
Program< /h2>
Код: Выделить всё
## imports
import pyvisa
from pyvisa.constants import StopBits, Parity
import struct
import time
## Connecting to counter
rm = pyvisa.ResourceManager()
TAC = rm.open_resource(self.TAC_address,
baud_rate = 19200,
data_bits = 8,
stop_bits = StopBits(20),
parity = Parity(0))
## Setting parameters
TAC.write(f"SCLR") ## clear measurement and display
TAC.write(f"WAIT 2") ## 2*2 ms delay between words
TAC.write(f"MODE 0") # 0 time mode
TAC.write(f"SIZE 10000") # number of samples
TAC.write(f"GSCL 2,250") # number of bins
## Starting measurement (acquisition)
TAC.write("SRCE 0") # Input A
TAC.write(f"SCEN 1") # 1 single acquisition
TAC.write(f"AUTM 0") # no auto restart
TAC.write("STRT")
## Wait for the end of measurement
state = 0
while state != 1:
state = int(TAC.query("*STB? 0"))
## returns 0 as long as measurement in progress
print(f'State : {state}')
time.sleep(5)
## retrieve data
self.meanlist = [] # result is stored here
for j in range(0,10):
data = TAC.query("XHST? "+str(j))
time.sleep(0.1)
data = data.rstrip("\r\n") # remove terminator to not mix integers and \r\n
data = data.encode() # convert to bytes
print(data)
# data = struct.unpack("
Подробнее здесь: [url]https://stackoverflow.com/questions/79134370/reading-binary-data-from-serial-port-instrument[/url]