Этот раздел предоставляет подробную информацию и примеры, исследуя асинхронные операции чтения и операции записи с объектом 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. Эти функции действуют синхронно.
Чтобы начаться, считывайте данные постоянно.
t.ReadAsyncMode = continuous;
Теперь, отправьте данные в сервер, который будет возвращен для чтения.
fprintf(t, 'Hello World 123');
Поскольку свойство ReadAsyncMode
установлено в continuous
, объект постоянно проверяет, доступны ли какие-либо данные. Если последняя функция fprintf
завершается, сервер начинает отправлять данные, данные считаны из сервера и хранятся во входном буфере.
t.BytesAvailable ans = 16
Можно принести данные из входного буфера объекта в рабочее пространство MATLAB с fscanf
.
fscanf(t) ans = Hello World 123
Затем, считайте данные вручную.
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');