Skip to content

Использование разных методов read для получения данных

Этот документ объясняет, как использовать различные методы read, доступные в библиотеке libspectrum, для получения спектральных данных. Библиотека предоставляет три основных способа получения данных: read(), read_non_block() и read_non_stop(), каждый со своим специфическим случаем использования.

Обзор методов read

read()

Метод read() - основной способ получения одного кадра или пакета кадров. Автоматически обрабатывает открытие и закрытие устройства, если оно еще не открыто.

  • Функциональность: Получает один кадр (или указанное количество кадров в одном пакете) со спектрометра.
  • Работа с устройством: Автоматически открывает устройство, если оно не открыто, и закрывает его после завершения, если оно не было открыто ранее.
  • Случай использования: Идеально подходит для получения отдельных измерений или когда требуется синхронное чтение определенного количества спектров.
  • Блокирующий: Это блокирующая операция. Метод не вернет результат, пока не завершит получение запрошенного количества спектров.

Пример:

from pyspectrum import Spectrometer

spectrometer = Spectrometer()

# Настройка конфигурации
spectrometer.set_config(
    exposure=100,  # миллисекунды
    n_times=5,     # количество измерений
    wavelength_calibration_path="calibration.json",
    dark_signal_path="dark.pkl"
)

# Получение пакета спектров
spectrum = spectrometer.read()

print(f"Размерность полученного спектра: {spectrum.shape}")

read_non_block()

Метод read_non_block() предоставляет способ неблокирующего чтения кадров со спектрометра. Использует функцию-callback.

  • Функциональность: Читает указанное кол-во кадров кускамии указанного размера. Вызывает callback функцию для каждого спектра.
  • Работа с устройством: Автоматически открывает устройство, если оно не открыто, и закрывает его после завершения.
  • Случай использования: Подходит для ситуаций, когда необходимо обрабатывать спектры по мере их поступления. Может использоваться, если требуется асинхронное чтение определенного количества спектров.
  • Неблокирующий: Эта функция неблокирующая, поскольку использует callback-функцию для обработки каждого спектра.

Пример:

from pyspectrum import Spectrometer
from pyspectrum.data import Spectrum

spectrometer = Spectrometer()

# Настройка спектрометра
spectrometer.set_config(
    exposure=100,
    wavelength_calibration_path="calibration.json",
    dark_signal_path="dark.pkl"
)

def process_spectrum(spectrum: Spectrum):
    print(f"Получен спектр с размерностью: {spectrum.shape}")
    # Реализация обработки спектра здесь

# Чтение 30 кадров с интервалом 10 кадров.
# Функция обратного вызова будет вызвана 3 раза (30 / 10 = 3)
spectrometer.read_non_block(callback=process_spectrum, frames_to_read=30, frames_interval=10)

read_non_stop()

Метод read_non_stop() используется для непрерывного получения данных в режиме реального времени. Использует отдельный поток.

  • Функциональность: Непрерывно получает спектры и обрабатывает каждый из них с помощью предоставленной callback-функции.
  • Работа с устройством: Автоматически открывает устройство, если оно не открыто, и оставляет его открытым.
  • Случай использования: Идеально подходит для приложений, где требуется непрерывный мониторинг спектра, например, для измерений в реальном времени.
  • Неблокирующий: Эта функция неблокирующая, поскольку использует отдельный поток для выполнения чтений.
  • Метод остановки: Используйте метод stop_reading() для остановки непрерывного получения данных.

Пример:

from pyspectrum import Spectrometer
from pyspectrum.data import Spectrum
import time

spectrometer = Spectrometer()

# Настройка спектрометра
spectrometer.set_config(
    exposure=100,
    wavelength_calibration_path="calibration.json",
    dark_signal_path="dark.pkl"
)

def process_spectrum(spectrum: Spectrum):
    print(f"Получен спектр с размерностью: {spectrum.shape}")
    # Реализация обработки спектра здесь

spectrometer.read_non_stop(callback=process_spectrum, frames_interval=100)

# Выполнение других действий в основной программе

# Остановка непрерывного получения данных через определенный период
time.sleep(5)
spectrometer.stop_reading()

Автоматическое управление устройством

Ключевой особенностью семейства методов read является их способность автоматически обрабатывать открытие и закрытие USB-устройства.

  • Если устройство еще не открыто: Метод read открывает устройство перед началом получения данных и закрывает его после завершения (если оно не было открыто ранее).
  • Если устройство уже открыто: Метод read использует существующее соединение, не закрывая его после завершения.

Это поведение упрощает распространенные случаи использования:

  • Вы можете использовать метод read() несколько раз без необходимости вручную вызывать методы open() и close().
  • Вы можете выполнять несколько чтений подряд с помощью метода read().

Выбор правильного метода

  • Используйте read() для получения отдельных измерений или пакетов измерений синхронно.
  • Используйте read_non_block() для асинхронного получения кадров.
  • Используйте read_non_stop() для непрерывного получения данных в режиме реального времени, используя метод stop_reading() для остановки процесса.