Этот раздел предоставляет подробную информацию и примеры, исследуя бинарные операции чтения и операции записи с объектом UDP.
Эти функции используются при чтении и записи двоичных данных:
Функция | Цель |
---|---|
fread | Считайте двоичные данные из инструмента или сервера. |
fwrite | Запишите двоичные данные в инструмент или сервер. |
Эти свойства сопоставлены с чтением и записью двоичных данных:
Свойство | Цель |
---|---|
ValuesReceived | Задает общее количество значений, считанных из инструмента или сервера. |
ValuesSent | Задает общее количество значений, отправленных в инструмент или сервер. |
InputBufferSize | Задает общее количество байтов, которые могут быть поставлены в очередь во входном буфере когда-то. |
OutputBufferSize | Задает общее количество байтов, которые могут быть поставлены в очередь в буфере вывода когда-то. |
DatagramTerminateMode | Задает, как fread и операции чтения fscanf останавливаются. |
Чтобы получить список опций, можно использовать на функции, нажать клавишу Tab после ввода функции на командной строке MATLAB®. Список расширяется, и можно прокрутить, чтобы выбрать свойство или значение. Для получения информации об использовании этой функции завершения вкладки "Дополнительно" смотрите Используя Заполнение клавишей Tab для Функций.
В данном примере мы будем использовать сервер эха, которому предоставляют тулбокс. Сервер эха позволяет вам экспериментировать с основной функциональностью объектов UDP, не соединяясь с существующим устройством. Сервер эха является сервисом, который возвращается к адресу и порту отправителя, те же байты, которые это получает от отправителя.
echoudp('on', 8000)
Необходимо создать объект UDP. В этом примере создайте объект UDP, сопоставленный с хостом 127.0.0.1 (ваша локальная машина), порт 8000. В целом имя хоста или адрес и серверный порт будут заданы устройством и вашей конфигурацией сети.
u = udp('127.0.0.1', 8000);
Вы, возможно, должны сконфигурировать OutputBufferSize
объекта UDP. Свойство OutputBufferSize
задает максимальное количество байтов, которые могут быть записаны в сервер целиком. По умолчанию OutputBufferSize
является 512
.
u.OutputBufferSize ans = 512
Если команда, заданная в fwrite
, содержит больше чем 512 байтов, ошибка возвращена, и никакие данные не записаны в сервер. В этом примере 1 000 байтов будут записаны в инструмент. Поэтому OutputBufferSize
увеличен до 1000
.
u.OutputBufferSize = 1000 u.OutputBufferSize ans = 1000
Прежде чем можно будет выполнить операцию чтения или операцию записи, необходимо соединить объект UDP с сервером с функцией fopen
.
fopen(u)
Если объект был успешно соединен, его свойство Status
автоматически сконфигурировано к open
.
u.Status ans = open
Порты UDP могут быть совместно использованы другими приложениями, чтобы позволить, чтобы несколько приложений слушали дейтаграммы UDP на том порте. Это допускает способность слушать широковещательные сообщения UDP на том же локальном номере порта и в MATLAB и в других приложениях. Можно включить и отключить эту возможность с новым свойством объекта UDP под названием EnablePortSharing
. Смотрите Включают Совместное использование Порта по UDP.
Вы используете функцию fwrite
, чтобы записать двоичные данные в сервер или инструмент.
По умолчанию функция fwrite
действует в синхронном режиме. Это означает, что fwrite
блокирует командную строку MATLAB, пока одно из следующего не происходит:
Все данные записаны
Тайм-аут происходит, как задано свойством Timeout
По умолчанию функция fwrite
пишет двоичные данные с помощью точности uchar
. Однако другая точность может также использоваться. Для списка поддерживаемой точности смотрите страницу ссылки на функцию для fwrite
.
UDP отправляет и получает данные в блоках, которые называются дейтаграммами. Каждый раз, когда вы пишете или считываете данные с объектом UDP, вы пишете или читаете дейтаграмму. В примере ниже, дейтаграмма с 1 000 байтов, 4 байтами за целое число, будет отправлена в echoserver.
fwrite(u, 1:250, 'int32');
При выполнении операции записи необходимо думать о передаваемых данных с точки зрения значений, а не байтов. Значение состоит из одного или нескольких байтов. Например, одно значение uint32
состоит из четырех байтов.
Свойство ValuesSent
указывает на общее количество значений, записанных в сервер, поскольку объект был соединен с сервером.
u.ValuesSent ans = 250
Свойство InputBufferSize
задает максимальное количество байтов, которые можно считать из сервера. По умолчанию InputBufferSize
является 512
.
u.InputBufferSize ans = 512
В следующем примере 1 000 байтов будут считаны из сервера. Сконфигурируйте InputBufferSize
, чтобы содержать 1 000 байтов. Отметьте, InputBufferSize
может быть сконфигурирован только, когда объект не соединяется с сервером или инструментом.
fclose(u); u.InputBufferSize = 1000); u.InputBufferSize ans = 1000
Теперь, когда свойство сконфигурировано правильно, можно вновь открыть связь с сервером:
fopen(u);
Вы используете функцию fread
, чтобы считать двоичные данные из сервера или инструмента.
Функциональные блоки fread
командная строка MATLAB до одного из следующего происходят:
Тайм-аут происходит, как задано свойством Timeout
Входной буфер заполнен
Конкретное количество значений читается (если DatagramTerminateMode
является off
),
Дейтаграмма была получена (если DatagramTerminateMode
является on
),
По умолчанию функция fread
считывает двоичные данные с помощью точности uchar
. Однако другая точность может также использоваться. Для списка поддерживаемой точности смотрите страницу ссылки на функцию для fread
.
При выполнении операции чтения необходимо думать о полученных данных с точки зрения значений, а не байтов. Значение состоит из одного или нескольких байтов. Например, одно значение uint32
состоит из четырех байтов.
Можно считать двоичные данные int32
. Например, считайте одну дейтаграмму, состоящую из 250 целых чисел от инструмента или сервера.
fwrite(u, 1:250, 'int32');
data = fread(u, 250, 'int32');
Свойство ValuesReceived
указывает на общее количество значений, считанных из сервера.
u.ValuesReceived ans = 500
Свойство DatagramTerminateMode
указывает, должна ли операция чтения остановиться, когда дейтаграмма получена. DatagramTerminateMode
по умолчанию on
, что означает, что операция чтения останавливается, когда дейтаграмма получена. Чтобы считать несколько дейтаграмм целиком, можно установить DatagramTerminateMode
на off
. В этом примере две дейтаграммы записаны в echoserver.
fwrite(u, 1:125, 'int32'); fwrite(u, 1:125, 'int32');
Поскольку DatagramTerminateMode
является off
, fread
будет читать через дейтаграммные контуры, пока 250 целых чисел не были получены.
u.DatagramTerminateMode = 'off'; data = fread(u, 250, 'int32'); size(data) ans = 250
Если вы закончены с объектом UDP, отключаете его от сервера, удаляете его из памяти и удаляете его из рабочей области. Если вы используете сервер эха, выключаете его.
fclose(u); delete(u); clear u
echoudp('off');