Считайте и запишите двоичные данные по TCP/IP

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

Примечание

Большинство настольных инструментов (осциллографы, функциональные преобразователи, и т.д.), которые обеспечивают сетевое соединение, не использует необработанную коммуникацию сокета TCP для инструментального командного пункта. Вместо этого это поддерживается через стандарт VISA. Для получения дополнительной информации об использовании VISA, чтобы связаться с вашим инструментом, см. Обзор VISA.

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

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

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

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

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

Примечание

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

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

В данном примере мы будем использовать сервер эха, которому предоставляют тулбокс. Сервер эха позволяет вам экспериментировать с основной функциональностью объектов TCP/IP, не соединяясь с существующим устройством. Сервер эха является сервисом, который возвращается к адресу и порту отправителя, те же байты, которые это получает от отправителя.

echotcpip('on', 4000)

Необходимо создать объект TCP/IP. В этом примере создайте объект TCP/IP, сопоставленный с хостом 127.0.0.1 (ваша локальная машина), порт 4000. В целом имя хоста или адрес и серверный порт будут заданы устройством и вашей конфигурацией сети.

t = tcpip('127.0.0.1', 4000);

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

t.OutputBufferSize
ans = 
    512

Если команда, заданная в fwrite, содержит больше чем 512 байтов, ошибка возвращена, и никакие данные не записаны в сервер. В этом примере 4 000 байтов будут записаны в сервер. Поэтому OutputBufferSize увеличен до 4000.

t.OutputBufferSize = 4000;
t.OutputBufferSize
ans = 
    4000

Вы, возможно, должны сконфигурировать ByteOrder объекта TCP/IP. Свойство ByteOrder задает порядок байтов сервера. ByteOrder по умолчанию bigEndian.

t.ByteOrder
ans = 
    'bigEndian'

Если порядок байтов сервера является прямым порядком байтов, свойство ByteOrder объекта может быть сконфигурировано к littleEndian:

t.ByteOrder = 'littleEndian'
t.ByteOrder
ans = 
    'littleEndian'

Прежде чем можно будет выполнить операцию чтения или операцию записи, необходимо соединить объект TCP/IP с сервером с функцией fopen.

fopen(t)

Если объект был успешно соединен, его свойство Status автоматически сконфигурировано к open.

t.Status
ans = 
    open

Запись двоичных данных

Вы используете функцию fwrite, чтобы записать двоичные данные в сервер. Например, следующая команда отправит синусоиду в сервер.

Создайте синусоиду, которая будет записана в сервер.

x = (0:999) .* 8 * pi / 1000;
data = sin(x);

Запишите синусоиду в сервер.

fwrite(t, data, 'float32');

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

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

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

По умолчанию функция fwrite пишет двоичные данные с помощью точности uchar. Однако другая точность может также использоваться. Для списка поддерживаемой точности смотрите страницу ссылки на функцию для fwrite.

Примечание

При выполнении операции записи необходимо думать о передаваемых данных с точки зрения значений, а не байтов. Значение состоит из одного или нескольких байтов. Например, одно значение uint32 состоит из четырех байтов.

Бинарные свойства записи

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

t.ValuesSent
ans = 
    1000

Конфигурирование InputBufferSize

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

t.InputBufferSize
ans = 
    512

Затем, форма волны, сохраненная в памяти функционального преобразователя, будет считана. Форма волны содержит 4 000 байтов. Сконфигурируйте InputBufferSize, чтобы содержать 4 000 байтов. Отметьте, InputBufferSize может быть сконфигурирован только, когда объект не соединяется с сервером.

fclose(t);
t.InputBufferSize = 4000;
t.InputBufferSize
ans = 
    4000

Теперь, когда свойство сконфигурировано правильно, можно вновь открыть связь с сервером:

fopen(t);

Чтение двоичных данных

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

Функциональные блоки fread командная строка MATLAB до одного из следующего происходят:

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

  • Конкретное количество значений читается

  • Количество InputBufferSize значений читается

По умолчанию функция fread считывает двоичные данные с помощью точности uchar. Однако другая точность может также использоваться. Для списка поддерживаемой точности смотрите страницу ссылки на функцию для fread.

Примечание

При выполнении операции чтения необходимо думать о полученных данных с точки зрения значений, а не байтов. Значение состоит из одного или нескольких байтов. Например, одно значение uint32 состоит из четырех байтов.

Для чтения двоичных данных float32 отправьте форму волны снова. Закрытие объекта очищает любые доступные данные из более ранних записей.

fwrite(t, data, 'float32');

Теперь считайте ту же форму волны как массив float32.

data = fread(t, 1000, 'float32');

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

t.ValuesReceived
ans = 
    1000

Очистка

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

fclose(t);
delete(t);
clear t
echotcpip('off');