Этот раздел предоставляет подробную информацию и примеры, исследуя асинхронные операции чтения и операции записи с объектом 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');