Чтение двоичных данных из прибора последовательного портаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Чтение двоичных данных из прибора последовательного порта

Сообщение Anonymous »

Введение
Я хотел бы получить двоичные данные от прибора (SR620) с помощью RS-232. Данные представляют собой гистограмму, состоящую из 250 ячеек. Программа Python, которую я создал, работает хорошо, когда данные не собираются (я получаю 250 нулей), но как только я начинаю измерение, выходные данные становятся странными, и я не могу их использовать. Я объясню сбор данных, структуру двоичных данных и дам краткую версию программы со всеми соответствующими элементами. Затем я описываю выходные данные и ошибку, которую я получаю, и устранение неполадок, которые я сделал.
Я понял, что проблема возникла из-за неправильного преобразования числа выше 127, см. Редактирование 4< /em>
Мои вопросы:
  • есть ли другие команды, которые я мог бы/должен использовать для получения двоичных данных ?
  • связано ли это с другими командами, алгоритмом, устройством и т. д. ?
  • откуда проблема, с программой, с устройством сам ?
Результат гистограммы, который я ожидаю. Какой-то периодический сигнал в течение трех периодов, а затем нули за последние 2,5 мкс.
Изображение

Сбор данных
Я подключаюсь к преобразователю время-амплитуда (TAC) SR620 с помощью pyvisa модуль на питоне. Могу правильно настроить прибор (установить значения параметров, режим измерения...). Соответственно меняется все на передней панели. Я подключаюсь с помощью этого

Код: Выделить всё

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))
В этом эксперименте я подсчитываю задержки между эталоном и событием на детекторе (обычно в диапазоне микросекунд). Мне нужны образцы N_Samples и получить гистограмму задержек. Я начинаю измерение с помощью TAC.write("STRT"). Обратите внимание, что когда я собираю гистограмму непосредственно в виде целого числа с машины (используя специальную функцию HSPT), она работает хорошо, но «медленно». В двоичном формате это намного быстрее, но оно «глючное».
Структура данных
Чтобы получить гистограмму в двоичном формате, я использую специальную команду XHST. В документации указано

XHST? j
XHST? запрос возвращает раздел j (j=0–9) гистограммы
отображается в виде 4-байтовых двоичных целых чисел, начиная с младшего байта. Каждая
секция состоит из данных по 25 точкам гистограммы (всего 100 байт
плюс терминатор). Между последовательными точками нет разделителя.
Если используется интерфейс rs232, необходимо выбрать 8-битное слово данных
для правильной передачи этих данных. Возвращенные данные группируются в 250 ячеек, а не в число, заданное на передней панели. Эта команда позволяет
быстро прочитать все содержимое гистограммы. Если гистограмма
пуста, возвращаются недопустимые цифры -0.

Итак, я понимаю, что мне нужно собрать 10 разделов, состоящих из 25 4-байтовые целые числа в двоичном формате. С терминатором() в конце каждого раздела, который я удаляю, чтобы не смешивать целые числа с '\r\n'. Базой для этого шага является j в диапазоне (0,10): data = TAC.query("XHST? "+str(j)).
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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Чтение двоичных данных из прибора последовательного порта
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Чтение двоичных данных из прибора последовательного порта
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Чтение двоичных данных из прибора последовательного порта
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Чтение двоичных данных из прибора последовательного порта
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Чтение двоичных данных из прибора последовательного порта
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»