Считайте и запишите данные о ASCII по UDP

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

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

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

ФункцияЦель
fprintfЗапишите текст в сервер.
fscanfСчитайте данные из сервера и отформатируйте как текст.

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

СвойствоЦель
ValuesReceivedЗадает общее количество значений, считанных из сервера.
ValuesSentЗадает общее количество значений, отправленных в сервер.
InputBufferSizeЗадает общее количество байтов, которые могут быть поставлены в очередь во входном буфере когда-то.
OutputBufferSizeЗадает общее количество байтов, которые могут быть поставлены в очередь в буфере вывода когда-то.
TerminatorСимвол раньше отключал команды, отправленные в сервер.

Примечание

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

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

В данном примере мы будем использовать сервер эха, которому предоставляют тулбокс. Сервер эха позволяет вам экспериментировать с основной функциональностью объектов 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.

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

Вы используете функцию fprintf, чтобы записать данные о ASCII в сервер. Например, запишите строку в echoserver.

fprintf(u, 'Request Time');

По умолчанию функция fprintf действует в синхронном режиме. Это означает, что fprintf блокирует командную строку MATLAB, пока одно из следующего не происходит:

  • Все данные записаны

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

По умолчанию fprintf функционирует данные о ASCII записей с помощью формата %s\n. Все случаи \n в команде, записанной в сервер, заменяются значением свойства Terminator. При использовании формата по умолчанию, %s\n, все команды, записанные в сервер, закончатся символом Terminator.

Для предыдущей команды отправляется перевод строки (LF) после того, как 'Request Time' записан в сервер, таким образом, указав на конец команды.

Можно также задать формат команды, записанной путем обеспечения третьего входного параметра fprintf. Принятые символы преобразования формата включают: d, i, o, u, x, X, f, e, E, g, G, c, и s.

Например, команда данных, ранее показанная, может быть записана в сервер с помощью двух вызовов fprintf.

fprintf(u, '%s', 'Request');
fprintf(u, '%s'\n, 'Time');

Символ Terminator указывает на конец команды и отправляется после последней возможности в fprintf.

Свойства записи ASCII

Свойство OutputBufferSize задает максимальное количество байтов, которые могут быть записаны в сервер целиком. По умолчанию OutputBufferSize является 512.

u.OutputBufferSize
ans = 
    512

Если команда, заданная в fprintf, содержит больше чем 512 байтов, ошибка возвращена, и никакие данные не записаны в сервер.

Свойство ValuesSent указывает на общее количество значений, записанных в сервер, поскольку объект был соединен с сервером.

u.ValuesSent
ans = 
    26

Удалите любые данные, которые были возвращены в echoserver и получены объектом UDP.

flushinput(u);

Чтение данных о ASCII

UDP отправляет и получает данные в блоках, которые называются дейтаграммами. Каждый раз, когда вы пишете или считываете данные с объектом UDP, вы пишете или читаете дейтаграмму. Например, дейтаграмма с 13 байтами (12 байтов ASCII плюс терминатор строки LF) отправляется в echoserver.

fprintf(u, 'Request Time');

Сервер эха передаст обратно дейтаграмму, содержащую те же 13 байтов.

u.BytesAvailable
ans = 
    13

Вы используете функцию fscanf, чтобы считать данные о ASCII из сервера.

data = fscanf(u)
data = 
    Request Time

По умолчанию данные о чтениях функции fscanf с помощью формата '%c' и блоков командная строка MATLAB до одного из следующего происходят:

  • Терминатор строки получен, как задано свойством Terminator (если DatagramTerminateMode является off),

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

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

  • Конкретное количество значений читается (если DatagramTerminateMode является off),

  • Дейтаграмма была получена (если DatagramTerminateMode включен),

Можно также задать формат данных, считанных путем обеспечения второго входного параметра fscanf. Принятые символы преобразования формата включают: d, i, o, u, x, X, f, e, E, g, G, c, и s.

Например, символ vector'0.80' отправленный в echoserver может быть считан в MATLAB как двойное использование вектора символов формата %f.

fprintf(u, '0.80');
data = fscanf(u, '%f')
data = 
    0.8000

isnumeric(data)
ans = 
    1

Свойства чтения ASCII

Свойство DatagramTerminateMode указывает, должна ли операция чтения остановиться, когда дейтаграмма получена. DatagramTerminateMode по умолчанию on, что означает, что операция чтения останавливается, когда дейтаграмма получена. Чтобы считать несколько дейтаграмм целиком, можно установить DatagramTerminateMode на off. В этом примере записаны две дейтаграммы. Отметьте, только вторая дейтаграмма отправляет символ Terminator.

fprintf(u, '%s', 'Request Time');
fprintf(u, '%s\n', 'Request Time'); 

Поскольку DatagramTerminateMode является off, fscanf будет читать через дейтаграммные контуры, пока символ Terminator не будет получен.

u.DatagramTerminateMode = 'off';
data = fscanf(u)
data = 
    Request TimeRequest Time

Свойство InputBufferSize задает максимальное количество байтов, которые можно считать из сервера. По умолчанию InputBufferSize является 512.

u.InputBufferSize
ans = 
    512

Свойство ValuesReceived указывает на общее количество значений, считанных из сервера, включая терминатор строки.

u.ValuesReceived
ans = 
    43

Очистка

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

fclose(u);
delete(u);
clear u
echoudp('off');