Асинхронные операции чтения и операции записи Используя VISA

Этот пример исследует асинхронные операции чтения и операции записи с помощью объекта VISA-GPIB. Используемый инструмент был осциллографом Tektronix® TDS 2024.

Этот пример исследует асинхронные операции чтения и операции записи для объекта VISA-GPIB-VXI. Однако асинхронные операции чтения и операции записи для VISA-GPIB, VISA-VXI, VISA-GPIB-VXI, VISA-TCPIP и объектов VISA-USB идентичны друг другу. Поэтому можно использовать те же команды. Единственной разницей является имя ресурса, заданное в конструкторе VISA.

Асинхронные операции чтения и операции записи для последовательного ВИЗОЙ объекта идентичны асинхронным операциям чтения и операциям записи для объекта последовательного порта. Поэтому, чтобы изучить, как выполнить асинхронные операции чтения и операции записи для последовательного ВИЗОЙ объекта, необходимо отослать к Последовательному порту Асинхронный пример по Чтению-записи.

Асинхронные операции чтения и операции записи не поддержаны для объекта VISA-RSIB.

Функции и свойства

Эти функции сопоставлены с чтением и записью текста асинхронно:

ФункцияЦель
fprintfЗапишите текст в инструмент.
readasyncАсинхронно считайте байты из инструмента.
stopasyncОстановите асинхронную операцию чтения или операцию записи.

Эти свойства сопоставлены с чтением и записью текста асинхронно:

СвойствоЦель
BytesAvailableУказывает на количество байтов, доступных во входном буфере.
TransferStatusУказывает, какая асинхронная операция происходит.

Кроме того, можно использовать все свойства коллбэка во время асинхронных операций чтения и операций записи.

Синхронный по сравнению с асинхронными операциями

Объект VISA может действовать или в синхронном или в асинхронный режим. В синхронном режиме командная строка MATLAB блокируется до

  • Операция чтения или операция записи завершаются

  • Тайм-аут происходит, как задано свойством Timeout

В асинхронном режиме управление сразу возвращено в командную строку MATLAB. Кроме того, можно использовать свойства коллбэка и функции обратного вызова, чтобы выполнить задачи, когда данные пишутся или считываются. Например, можно создать функцию обратного вызова, которая уведомляет вас, когда операция чтения или операция записи закончились.

Конфигурирование и соединение с инструментом

Необходимо создать объект VISA-GPIB. В этом примере объект создается с помощью драйвера ni и строки ресурса VISA, показанной ниже.

v = visa('ni', 'GPIB0::2::INSTR')

Прежде чем можно будет выполнить операцию чтения или операцию записи, необходимо соединить объект VISA-GPIB с инструментом с функцией fopen.

fopen(v)

Если объект был успешно соединен, его свойство Status автоматически сконфигурировано к open.

v.Status
ans = 
    open

Чтение данных асинхронно

Асинхронной функциональностью чтения объекта VISA-GPIB управляют с функцией readasync. Запросите инструмент для канала 1 вертикальная шкала:

fprintf(v, 'CH1:Scale?');

Функция readasync может асинхронно считать данные из инструмента. Функция readasync возвращает управление в подсказку команды MATLAB сразу.

readasync(v, 20);

Функция readasyn без заданного размера примет, что размер дан различием между значением свойства InputBufferSize и значением свойства BytesAvailable. В вышеупомянутом примере размер равняется 20. Асинхронное чтение останавливается, когда одно из следующего происходит:

  • Терминатор строки читается, как задано свойством EOSCharCode

  • Конкретное количество байтов хранится во входном буфере

  • Тайм-аут происходит, как задано свойством Timeout

  • Строка EOI утверждалась

Ошибочное событие будет сгенерировано, если readasync остановится из-за тайм-аута.

Асинхронные свойства чтения

TransferStatus

Свойство TransferStatus указывает, какая асинхронная операция происходит. Для объектов VISA-GPIB TransferStatus может быть сконфигурирован как read, write или idle.

v.TransferStatus
ans = 
    idle

В то время как асинхронное чтение происходит, ошибка происходит, если вы выполняете другую запись или асинхронную операцию чтения. Можно остановить асинхронную операцию чтения с функцией stopasync. Данные во входном буфере останутся после того, как stopasync называется. Это позволяет вам приносить данные, которые были считаны в рабочее пространство MATLAB с одной из синхронных стандартных программ чтения (fscanf, fgetl, fgets или fread).

BytesAvailable

Если мы теперь смотрим на свойство BytesAvailable, вы видите, что 6 байтов были считаны.

v.BytesAvailable
ans = 
    6

Можно принести данные в рабочее пространство MATLAB с функцией fscanf.

data = fscanf(v, '%g')
data =
     1

Используя коллбэки во время асинхронного чтения

Теперь, сконфигурируйте объект VISA-GPIB уведомить вас, когда перевод строки будет считан. Свойство BytesAvailableFcnMode управляет, когда событие BytesAvailable создается. По умолчанию событие BytesAvailable создается, когда символ EOSCharCode получен. Событие BytesAvailable может также быть создано после определенного числа байтов были считаны. Обратите внимание на то, что свойство BytesAvailableFcnMode не может быть сконфигурировано, в то время как объект соединяется с инструментом.

set(v, 'BytesAvailableFcn', {'dispcallback'});
set(v, 'EOSCharCode', 10);

Функция обратного вызова dispcallback отображает сообщение, содержащее тип события, имя объекта, который заставил событие происходить, и время событие, произошла.

Теперь, запросите инструмент для частоты сигнала. Если перевод строки был считан из инструмента и помещен во входной буфер, dispcallback будет выполняться, и сообщение будет отображено к окну команды MATLAB, указывающему, что событие BytesAvailable имело место.

fprintf(v, 'CH2:Scale?');
readasync(v);

Позвольте время для ответа. В типовом приложении это - то, где вы могли сделать другие задачи.

pause(0.5);

A BytesAvailable event occurred for VISA-GPIB0-2 at 01-Jun-2005 15:08:34.

v.BytesAvailable

ans =

     6

data = fscanf(v, '%c', 6)

data =

    à (0

Обратите внимание на то, что последнее чтение значения является переводом строки (10):

real(data)

ans =

   224    32    40    16    48    10

Запись данных асинхронно

Можно выполнить асинхронную запись с fprintf или функциями fwrite путем передачи флага 'async' как последнего входного параметра.

В то время как асинхронная запись происходит, ошибка происходит, если вы выполняете операцию чтения или операцию записи. Можно остановить асинхронную операцию записи с функцией stopasync. Данные, остающиеся в буфере вывода, будут сброшены.

Также сконфигурируйте объект уведомить вас, когда операция записи завершится путем определения асинхронного коллбэка записи.

set(v, 'OutputEmptyFcn', {'dispcallback'});
fprintf(v, 'CH1:Scale?', 'async');

Очистка

Если вы закончены с объектом VISA-GPIB, отключаете его от инструмента, удаляете его из памяти и удаляете его из рабочей области.

fclose(v);
delete(v);
clear v