События и обратные вызовы

Введение

Можно улучшить степень и гибкость приложения последовательного порта при помощи events. Событие имеет место после того, как условие соблюдают и может привести к одному или нескольким коллбэкам.

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

Вы выполняете коллбэк, когда конкретное событие имеет место путем определения имени функции обратного вызова как значение для связанного свойства коллбэка.

Пример - введение в События и обратные вызовы

Этот пример использует функцию обратного вызова instrcallback, чтобы отобразить сообщение к командной строке, когда доступное байтам событие имеет место. Событие сгенерировано, когда терминатор строки читается.

s = serial('COM1');
s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcn = @instrcallback;
fopen(s)
fprintf(s,'*IDN?')
out = fscanf(s);

Отображения MATLAB:

BytesAvailable event occurred at 17:01:29 for the object: 
Serial-COM1.

Закончите сеанс последовательного порта.

fclose(s)
delete(s)
clear s

Чтобы видеть код для встроенной функции instrcallback, используйте команду type.

Event Types and Callback Properties

Следующая таблица описывает типы событий последовательного порта и свойства коллбэка. Эта таблица имеет два столбца и девять строк. В первом столбце (тип события) второй элемент (доступные байты) применяется к строкам 2 - 4. Кроме того, в первом столбце последний элемент (таймер) применяется к строкам 8 и 9.

Event Types and Callback Properties

Тип событияСвязанные свойства

Повредите прерывание

BreakInterruptFcn

BytesAvailable

BytesAvailableFcn

BytesAvailableFcnCount

BytesAvailableFcnMode

Ошибка

ErrorFcn

Выведите пустой

OutputEmptyFcn

PinStatus

PinStatusFcn

Таймер

TimerFcn

TimerPeriod

Событие прерывания пропуска

Событие прерывания пропуска сразу сгенерировано после того, как прерывание пропуска сгенерировано последовательным портом. Последовательный порт генерирует прерывание пропуска, когда полученные данные были в неактивном состоянии дольше, чем время передачи для одного символа.

Это событие выполняет функцию обратного вызова, заданную для свойства BreakInterruptFcn. Это может быть сгенерировано и для синхронных и для асинхронных операций чтения и операций записи.

Доступное байтам событие

Доступное байтам событие сразу сгенерировано после предопределенного количества байтов доступны во входном буфере, или терминатор строки читается, как определено свойством BytesAvailableFcnMode.

Если BytesAvailableFcnMode является byte, доступное байтам событие выполняет функцию обратного вызова, заданную для свойства BytesAvailableFcn каждый раз, когда количество байтов, заданных BytesAvailableFcnCount, хранится во входном буфере. Если BytesAvailableFcnMode является terminator, функция обратного вызова выполняется каждый раз, когда символ, заданный свойством Terminator, читается.

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

Ошибочное событие

Ошибочное событие сразу сгенерировано после того, как ошибка происходит.

Это событие выполняет функцию обратного вызова, заданную для свойства ErrorFcn. Это может быть сгенерировано только во время асинхронной операции чтения или операции записи.

Ошибочное событие сгенерировано, когда тайм-аут происходит. Тайм-аут происходит, если операция чтения или операция записи успешно не завершаются в течение времени, заданного свойством Timeout. Ошибочное событие не сгенерировано для ошибок настройки, таких как установка недопустимого значения свойства.

Пустое от вывода событие

Пустое от вывода событие сразу сгенерировано после того, как буфер вывода пуст.

Это событие выполняет функцию обратного вызова, заданную для свойства OutputEmptyFcn. Это может быть сгенерировано только во время асинхронной операции записи.

Прикрепление события изменения состояния

Событие изменения состояния контакта сразу сгенерировано после состояния (значение контакта) изменения для CD, CTS, DSR или контактов RI. Для описания этих контактов смотрите Сигналы Последовательного порта и Назначения контактов.

Это событие выполняет функцию обратного вызова, заданную для свойства PinStatusFcn. Это может быть сгенерировано и для синхронных и для асинхронных операций чтения и операций записи.

Событие таймера

Событие таймера сгенерировано, когда время, заданное свойством TimerPeriod, передает. Время измеряется относительно того, когда объект последовательного порта соединяется с устройством.

Это событие выполняет функцию обратного вызова, заданную для свойства TimerFcn. Обратите внимание на то, что некоторые события таймера не могут быть обработаны, если вашу систему значительно замедляют или если значение TimerPeriod является слишком маленьким.

Ответ на информацию о событии

Можно ответить на информацию о событии в функции обратного вызова или в файле записи. Информация о событии хранится в функции обратного вызова с помощью двух полей: Type и Data. Поле Type содержит тип события, в то время как поле Data содержит привязанную к конкретному событию информацию. Как описано в Создают и Выполняют Функции обратного вызова, эти два поля сопоставлены со структурой, которую вы задаете в заголовке функции обратного вызова. Чтобы узнать о записи данных и информации о событии к файлу записи, смотрите Отладку: Запись информации к диску.

Следующая таблица показывает типы событий и значения для полей Type и Data. Таблица имеет три столбца и 15 строк. Элементы в первом столбце (тип события) промежуток несколько строк, можно следующим образом:

Прерывание пропуска: строки 1 и 2

BytesAvailable: строки 3 и 4

Ошибка: строки 5 - 7

Пустой вывод: строки 8 и 9

PinStatus: строки 10 - 13

Таймер: строки 14 и 15

Информация о событии

Тип событияПоле Значение поля

Повредите прерывание

Type

BreakInterrupt

Data.AbsTime

дневной год месяца hour:minute:second

BytesAvailable

Type

BytesAvailable

Data.AbsTime

дневной год месяца hour:minute:second

Ошибка

Type

Error

Data.AbsTime

дневной год месяца hour:minute:second

Data.Message

Строка ошибки

Выведите пустой

Type

OutputEmpty

Data.AbsTime

дневной год месяца hour:minute:second

PinStatus

Type

PinStatus

Data.AbsTime

дневной год месяца hour:minute:second

Data.Pin

CarrierDetect, ClearToSend, DataSetReady или RingIndicator

Data.PinValue

on или off

Таймер

Type

Timer

Data.AbsTime

дневной год месяца hour:minute:second

Следующие темы описывают значения полей Data.

Поле AbsTime

Поле AbsTime, заданное для всех событий, является абсолютным временем, которое имело место событие. Абсолютное время возвращено с помощью формата clock: дневной год месяца hour:minute:second.

Прикрепление поля

Событие изменения состояния контакта использует поле Pin, чтобы указать если CD, CTS, DSR или контакты RI измененное состояние. Для описания этих контактов смотрите Сигналы Последовательного порта и Назначения контактов.

Поле PinValue

Событие изменения состояния контакта использует поле PinValue, чтобы указать на состояние CD, CTS, DSR или контактов RI. Возможными значениями является on или off.

Обмен сообщениями поля

Ошибочное событие использует поле Message, чтобы хранить описательное сообщение, которое сгенерировано, когда ошибка происходит.

Создание и выполнение функций обратного вызова

Чтобы задать функцию обратного вызова, которая будет выполняться, когда тип определенного события произойдет, включайте имя файла как значение для связанного свойства коллбэка. Можно задать функцию обратного вызова как указатель на функцию или как элемент массива ячеек строки. Для получения информации об указателях на функцию см. Создание указателя на функцию.

Например, чтобы выполнить функцию обратного вызова mycallback каждый раз терминатор строки читается из вашего устройства:

s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcn = @mycallback;

Также можно задать функцию обратного вызова как массив ячеек.

s.BytesAvailableFcn = {'mycallback'};

Функции обратного вызова требуют по крайней мере двух входных параметров. Первый аргумент является объектом последовательного порта. Второй аргумент является переменной, которая получает информацию о событии, показанную в таблице, Информации о событии. Эта информация о событии принадлежит только событию, которое заставило функцию обратного вызова выполняться. Функциональный заголовок для mycallback:

function mycallback(obj,event)

Вы передаете дополнительные параметры функции обратного вызова включением и функция обратного вызова и параметры как элементы массива ячеек. Например, чтобы передать переменную MATLAB time mycallback:

time = datestr(now,0);
s.BytesAvailableFcnMode = 'terminator';
s.BytesAvailableFcn = {@mycallback,time};

Также можно задать функцию обратного вызова как строку в массиве ячеек.

s.BytesAvailableFcn = {'mycallback',time};

Соответствующий функциональный заголовок:

function mycallback(obj,event,time)

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

Примечание

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

Включение функций обратного вызова после того, как они ошибка

Если ошибка происходит, в то время как функция обратного вызова выполняется, следующее происходит:

  • Функция обратного вызова автоматически отключена.

  • Предупреждение выведено в командной строке, указав, что функция обратного вызова отключена.

Если вы хотите включить ту же функцию обратного вызова, установите свойство коллбэка на то же значение или отключите объект с функцией fclose. Если вы хотите использовать различную функцию обратного вызова, коллбэк включен, когда вы конфигурируете свойство коллбэка к новому значению.

Пример - Используя События и обратные вызовы

Этот пример использует функцию обратного вызова instrcallback, чтобы отобразить событийную информацию к командной строке, когда доступное байтам событие или пустое от вывода событие происходят.

  1. Создайте объект последовательного порта — Создают объект последовательного порта s, сопоставленный с последовательным портом COM1.

    s = serial('COM1');
  2. Сконфигурируйте свойства — Конфигурируют s, чтобы выполнить функцию обратного вызова instrcallback, когда доступное байтам событие или пустое от вывода событие происходят. Поскольку instrcallback требует, чтобы объект последовательного порта и информация о событии были переданы как входные параметры, функция обратного вызова задана как указатель на функцию.

    s.BytesAvailableFcnMode = 'terminator';
    s.BytesAvailableFcn = @instrcallback;
    s.OutputEmptyFcn = @instrcallback;
  3. Соединитесь с устройством — Подключение s к осциллографу Tektronix® TDS 210. Поскольку значением по умолчанию для свойства ReadAsyncMode является continuous, данные асинхронно возвращены во входной буфер, как только это доступно от инструмента.

    fopen(s)
  4. Запишите и считайте данные — Запись команда RS232? асинхронно к осциллографу. Эта команда запрашивает настройки RS-232 и возвращает скорость в бодах, установку программного управления потоком, установку аппаратного управления потоками, тип контроля четности и терминатор строки.

    fprintf(s,'RS232?','async')

    instrcallback называется после того, как команда RS232? отправляется, и когда терминатор строки читается. Получившиеся отображения:

    OutputEmpty event occurred at 17:37:21 for the object: 
    Serial-COM1.
    
    BytesAvailable event occurred at 17:37:21 for the object: 
    Serial-COM1.

    Считайте данные из входного буфера.

    out = fscanf(s)
    out =
    9600;0;0;NONE;LF
  5. Разъединитесь и вымойтесь — Когда вы больше не будете нуждаться в s, будете отключать его от инструмента и удалять его из памяти и из рабочего пространства MATLAB.

    fclose(s)
    delete(s)
    clear s