Асинхронные операции чтения и операции записи по TCP/IP

Этот раздел предоставляет подробную информацию и примеры, исследуя асинхронные операции чтения и операции записи с объектом TCP/IP.

Примечание

Большинство настольных инструментов (осциллографы, функциональные преобразователи, и т.д.), которые обеспечивают сетевое соединение, не использует необработанную коммуникацию сокета TCP для инструментального командного пункта. Вместо этого это поддерживается через стандарт VISA. Для получения дополнительной информации об использовании VISA, чтобы связаться с вашим инструментом, см. Обзор VISA.

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

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

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

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

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

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

Примечание

Чтобы получить список опций, можно использовать на функции, нажать клавишу Tab после ввода функции на командной строке MATLAB®. Список расширяется, и можно прокрутить, чтобы выбрать свойство или значение. Для получения информации об использовании этой функции завершения вкладки "Дополнительно" смотрите Используя Заполнение клавишей Tab для Функций.

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

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

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

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

В данном примере мы будем использовать сервер эха, которому предоставляют тулбокс. Сервер эха позволяет вам экспериментировать с основной функциональностью объектов TCP/IP, не соединяясь с существующим устройством. Сервер эха является сервисом, который возвращается к адресу и порту отправителя, те же байты, которые это получает от отправителя.

echotcpip('on', 4000)

Необходимо создать объект TCP/IP. В этом примере создайте объект TCP/IP, сопоставленный с хостом 127.0.0.1 (ваша локальная машина), порт 4000. В целом имя хоста или адрес и серверный порт будут заданы устройством и вашей конфигурацией сети.

t = tcpip('127.0.0.1', 4000);

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

fopen(t)

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

t.Status
ans = 
    open

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

Можно считать данные асинхронно с объектом TCP/IP одним из этих двух способов:

  • Постоянно, установкой ReadAsyncMode к continuous. В этом режиме данные автоматически хранимы во входном буфере, когда это становится доступным с сервера.

  • Вручную, установкой ReadAsyncMode к manual. В этом режиме необходимо вызвать функцию readasync, чтобы хранить данные во входном буфере.

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

Чтение данных асинхронно – непрерывный ReadAsyncMode

Чтобы начаться, считывайте данные постоянно.

t.ReadAsyncMode = continuous;

Теперь, отправьте данные в сервер, который будет возвращен для чтения.

fprintf(t, 'Hello World 123');

Поскольку свойство ReadAsyncMode установлено в continuous, объект постоянно проверяет, доступны ли какие-либо данные. Если последняя функция fprintf завершается, сервер начинает отправлять данные, данные считаны из сервера и хранятся во входном буфере.

t.BytesAvailable
ans = 
    16

Можно принести данные из входного буфера объекта в рабочее пространство MATLAB с fscanf.

fscanf(t)
ans = 
    Hello World 123

Чтение данных асинхронно – руководство ReadAsyncMode

Затем, считайте данные вручную.

t.ReadAsyncMode = manual;

Теперь, отправьте данные в сервер, который будет возвращен для чтения.

fprintf(t, 'Hello World 456');

Если последняя функция fprintf завершается, сервер начинает отправлять данные. Однако, потому что ReadAsyncMode установлен в manual, объект не считывает данные, отправляемые от сервера. Поэтому никакие данные не считываются и помещаются во входной буфер.

t.BytesAvailable
ans = 
    0

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

Функция readasync берет два входных параметра. Первый аргумент является серверный объектом, и вторым аргументом является size, объем данных, который будет считан из сервера.

Функция readasync без заданного size принимает, что size дан различием между значением свойства InputBufferSize и значением свойства BytesAvailable. Асинхронное чтение останавливается когда:

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

  • Конкретное количество байтов было считано

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

  • Входной буфер заполнен

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

Объект начинает запрашивать сервер для данных, когда функция readasync вызвана. Поскольку все данные были отправлены перед вызовом функции readasync никакие данные не будут храниться во входном буфере, и данные потеряны.

Когда объект TCP/IP находится в ручном режиме (свойство ReadAsyncMode сконфигурировано к manual), данные, которые отправляются с сервера на компьютер, не автоматически хранимы во входном буфере объекта TCP/IP. Данные не хранимы до readasync или одной из функций чтения блокирования называется.

Ручной режим должен использоваться, когда поток данных отправляется от вашего сервера, и вы только хотите получить фрагменты данных.

Определение асинхронного коллбэка чтения

Можно сконфигурировать объект TCP/IP уведомить вас, когда терминатор строки был считан с помощью функции dispcallback.

t.ReadAsyncMode = 'continuous';
t.BytesAvailableFcn = 'dispcallback';

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

Функция обратного вызова dispcallback отображает информацию о событии для заданного события. Используя синтаксис dispcallback(obj, event), это отображает сообщение, содержащее тип события, имя объекта, который заставил событие происходить, и время, которое имело место событие.

callbackTime = datestr(datenum(event.Data.AbsTime));
fprintf(['A ' event.Type ' event occurred for ' obj.Name ' at ' 
     callbackTime '.\n']);

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

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

fprintf(t, 'Hello World 789')
t.BytesAvailable
ans = 
    16

data = fscanf(t, '%c', 18)
data = 
    Hello World 789

Примечание

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

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

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

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

t.OutputEmptyFcn = 'dispcallback';
fprintf(t, 'Hello World 123', 'async')

Примечание

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

Очистка

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

fclose(t);
delete(t);
clear t
echotcpip('off');