Этот раздел предоставляет подробную информацию и примеры, исследуя асинхронные операции чтения и операции записи с объектом UDP.
Чтение данных асинхронно Используя непрерывный ReadAsyncMode
Чтение данных асинхронно Используя руководство ReadAsyncMode
Эти функции сопоставлены с чтением и записью текста асинхронно:
Функция | Цель |
---|---|
fprintf | Запишите текст в сервер. |
readasync | Асинхронно считайте байты из сервера. |
stopasync | Остановите асинхронную операцию чтения или операцию записи. |
Эти свойства сопоставлены с чтением и записью текста асинхронно:
Свойство | Цель |
---|---|
BytesAvailable | Указывает на количество байтов, доступных во входном буфере. |
TransferStatus | Указывает, какая асинхронная операция происходит. |
ReadAsyncMode | Указывает, считаны ли данные постоянно в фоновом режиме или необходимо ли вызвать функцию readasync , чтобы считать данные асинхронно. |
Кроме того, можно использовать все свойства коллбэка во время асинхронных операций чтения и операций записи.
Чтобы получить список опций, можно использовать на функции, нажать клавишу Tab после ввода функции на командной строке MATLAB®. Список расширяется, и можно прокрутить, чтобы выбрать свойство или значение. Для получения информации об использовании этой функции завершения вкладки "Дополнительно" смотрите Используя Заполнение клавишей Tab для Функций.
Объект может действовать в синхронном режиме или в асинхронном режиме. Когда объект действует синхронно, чтение и стандартные программы записи блокируют командную строку MATLAB, пока операция не завершилась, или тайм-аут происходит. Когда объект действует асинхронно, чтение и стандартные программы записи сразу возвращают управление в командную строку MATLAB.
Кроме того, можно использовать свойства коллбэка и функции обратного вызова, чтобы выполнить задачи, когда данные пишутся или считываются. Например, можно создать функцию обратного вызова, которая уведомляет вас, когда операция чтения или операция записи закончились.
В данном примере мы будем использовать сервер эха, которому предоставляют тулбокс. Сервер эха позволяет вам экспериментировать с основной функциональностью объектов UDP, не соединяясь с существующим устройством. Сервер эха является сервисом, который возвращается к адресу и порту отправителя, те же байты, которые это получает от отправителя.
echoudp('on', 8000);
Необходимо создать объект UDP. В этом примере создайте объект UDP, сопоставленный с хостом 127.0.0.1 (ваша локальная машина), порт 8000. В целом имя хоста или адрес и серверный порт будут заданы устройством и вашей конфигурацией сети.
u = udp('127.0.0.1', 8000);
Прежде чем можно будет выполнить операцию чтения или операцию записи, необходимо соединить объект UDP с сервером с функцией fopen
.
fopen(u)
Если объект был успешно соединен, его свойство Status
автоматически сконфигурировано к open
.
u.Status ans = open
Порты UDP могут быть совместно использованы другими приложениями, чтобы позволить, чтобы несколько приложений слушали дейтаграммы UDP на том порте. Это допускает способность слушать широковещательные сообщения UDP на том же локальном номере порта и в MATLAB и в других приложениях. Можно включить и отключить эту возможность с новым свойством объекта UDP под названием EnablePortSharing
. Смотрите Включают Совместное использование Порта по UDP.
Можно считать данные асинхронно с объектом UDP одним из этих двух способов:
Постоянно, установкой ReadAsyncMode
к continuous
. В этом режиме данные автоматически хранимы во входном буфере, когда это становится доступным с сервера.
Вручную, установкой ReadAsyncMode
к manual
. В этом режиме необходимо вызвать функцию readasync
, чтобы хранить данные во входном буфере.
fscanf
, fread
, fgetl
и функции fgets
используются, чтобы принести данные из входного буфера в MATLAB. Эти функции действуют синхронно.
Считывать данные постоянно:
u.ReadAsyncMode = 'continuous';
Отправить строку в echoserver:
fprintf(u, 'Hello net.');
Поскольку свойство ReadAsyncMode
установлено в continuous
, объект постоянно спрашивает сервер, если какие-либо данные доступны. echoserver отправляет данные, как только это получает данные. Данные затем считаны из сервера и хранятся во входном буфере объекта.
u.BytesAvailable ans = 11
Можно принести данные из входного буфера объекта в рабочее пространство MATLAB с fscanf
.
mystring = fscanf(u) mystring = Hello net.
Можно также считать данные вручную.
u.ReadAsyncMode = manual;
Теперь, отправьте строку в echoserver.
fprintf(u, 'Hello net.');
Если последняя функция fprintf
завершается, сервер начинает отправлять данные. Однако, потому что ReadAsyncMode
установлен в manual
, объект не считывает данные, отправляемые от сервера. Поэтому никакие данные не считываются и помещаются во входной буфер.
u.BytesAvailable ans = 0
Функция readasync
может асинхронно считать данные из сервера. Функция readasync
возвращает управление в командную строку MATLAB сразу.
Функция readasync
берет два входных параметра. Первый аргумент является серверный объектом, и вторым аргументом является size
, объем данных, который будет считан из сервера.
Функция readasync
без заданного size
принимает, что size
дан различием между значением свойства InputBufferSize
и значением свойства BytesAvailable
. Асинхронное чтение останавливается когда:
Терминатор строки читается, как задано свойством Terminator
Конкретное количество байтов было считано
Тайм-аут происходит, как задано свойством Timeout
Входной буфер заполнен
Ошибочное событие будет сгенерировано, если readasync
остановится из-за тайм-аута.
Объект начинает запрашивать сервер для данных, когда функция readasync
вызвана. Поскольку все данные были отправлены перед вызовом функции readasync
никакие данные не будут храниться во входном буфере, и данные потеряны.
Когда объект UDP находится в ручном режиме (свойство ReadAsyncMode
сконфигурировано к manual
), данные, которые отправляются с сервера на компьютер, не автоматически хранимы во входном буфере объекта UDP. Данные не хранимы до readasync
или одной из функций чтения блокирования называется.
Ручной режим должен использоваться, когда поток данных отправляется от вашего сервера, и вы только хотите получить фрагменты данных.
Можно сконфигурировать объект UDP уведомить вас, когда терминатор строки был считан с помощью функции dispcallback
.
u.ReadAsyncMode = 'continuous'; u.BytesAvailableFcn = 'dispcallback';
Отметьте, значение по умолчанию для свойства BytesAvailableFcnMode
указывает, что функция обратного вызова, заданная свойством BytesAvailableFcn
, будет выполняться, когда терминатор строки был считан.
u.BytesAvailableFcnMode ans = terminator
Функция обратного вызова 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(u, 'Hello net.') u.BytesAvailable ans = 11 data = fscanf(u) data = Hello net.
Если необходимо остановить асинхронную операцию чтения или операцию записи, вы не должны ожидать операции, чтобы завершиться. Можно использовать функцию stopasync
, чтобы остановить асинхронное чтение или запись.
stopasync(u);
Данные, которые были считаны из сервера, остаются во входном буфере. Можно использовать одну из синхронных функций чтения, чтобы принести эти данные в рабочее пространство MATLAB. Однако, потому что эти данные представляют неправильные данные, функция flushinput
вызвана, чтобы удалить все данные из входного буфера.
flushinput(u);
Можно выполнить асинхронную запись с fprintf
или функциями fwrite
путем передачи 'async'
как последнего входного параметра.
Сконфигурируйте объект уведомить вас, когда асинхронная операция записи завершится.
u.OutputEmptyFcn = 'dispcallback'; fprintf(u, 'Hello net.', 'async')
UDP отправляет и получает данные в блоках, которые называются дейтаграммами. Каждый раз, когда вы пишете или считываете данные с объектом UDP, вы пишете или читаете дейтаграмму. В примере ниже, дейтаграмма с 11 байтами (10 байтов ASCII плюс терминатор строки LF) будет отправлена в echoserver. Затем echoserver передаст обратно дейтаграмму, содержащую те же 11 байтов.
Сконфигурируйте объект уведомить вас, когда дейтаграмма будет получена.
u.DatagramReceivedFcn = 'dispcallback'; fprintf(u, 'Hello net.', 'async')
Если необходимо остановить асинхронную операцию чтения или операцию записи, вы не должны ожидать операции, чтобы завершиться. Можно использовать функцию stopasync
, чтобы остановить асинхронное чтение или запись.
Если вы закончены с объектом UDP, отключаете его от сервера, удаляете его из памяти и удаляете его из рабочей области. Если вы используете сервер эха, выключаете его.
fclose(u); delete(u); clear u
echoudp('off');