Запись и чтение данных

Асинхронная запись и операции чтения

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

ФункцияЦель
fprintfЗапишите текст в инструмент.
readasyncАсинхронно считайте байты из инструмента.
stopasyncОстановите асинхронную операцию чтения или операцию записи.

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

СвойствоЦель
BytesAvailableУказывает на количество байтов, доступных во входном буфере.
TransferStatusУказывает, какая асинхронная операция происходит.
ReadAsyncModeУказывает, считаны ли данные постоянно в фоновом режиме или необходимо ли вызвать функцию readasync, чтобы считать данные асинхронно.

Кроме того, можно использовать все свойства коллбэка во время асинхронных операций чтения и операций записи.

Асинхронная запись и операции чтения не блокируют доступ к Командному окну MATLAB®. Кроме того, в то время как асинхронная операция происходит, вы можете

  • Выполните чтение (запись) операция, в то время как асинхронная запись (чтение) операция происходит. Это вызвано тем, что последовательные порты имеют отдельные контакты для чтения и записи.

  • Используйте все поддерживаемые свойства коллбэка. Обратитесь к Событиям и Коллбэкам для получения дополнительной информации о свойствах коллбэка, поддержанных объектами последовательного порта.

Процесс записывания данные асинхронно подан Синхронный По сравнению с Асинхронными Операциями записи.

Для общего обзора о записи и чтении данных, а также списка всех присоединенных функций и свойств, относятся к Связи с Вашим Инструментом.

Асинхронные операции чтения

Для объектов последовательного порта вы задаете, являются ли операции чтения синхронными или асинхронными со свойством ReadAsyncMode. Можно сконфигурировать ReadAsyncMode к continuous или manual.

Если ReadAsyncMode является continuous (значение по умолчанию), объект последовательного порта постоянно запрашивает инструмент, чтобы определить, доступны ли данные, чтобы быть считанными. Если данные доступны, они асинхронно хранятся во входном буфере. Чтобы передать данные от входного буфера до рабочего пространства MATLAB, вы используете один из синхронных (блокирование) функции чтения, такие как fgetl, fgets, fscanf или fread. Если данные будут доступны во входном буфере, эти функции возвратятся быстро.

Примечание

Этим примером является конкретный Windows®.

s = serial('COM1');
fopen(s)
s.ReadAsyncMode = 'continuous';
fprintf(s,'*IDN?')
s.BytesAvailable
ans =
    56
out = fscanf(s);

Если ReadAsyncMode является manual, объект последовательного порта постоянно не запрашивает инструмент, чтобы определить, доступны ли данные, чтобы быть считанными. Чтобы считать данные асинхронно, вы используете функцию readasync. Вы затем используете одну из синхронных функций чтения, чтобы передать данные от входного буфера до рабочего пространства MATLAB.

s.ReadAsyncMode = 'manual';
fprintf(s,'*IDN?')
s.BytesAvailable
ans =
    0
readasync(s)
s.BytesAvailable
ans =
    56
out = fscanf(s);

Запись и чтение асинхронных данных

Этот пример исследует асинхронные операции чтения и операции записи с помощью объекта последовательного порта. Используемый инструмент был осциллографом Tektronix(R) TDS 210.

Чтобы начаться, создайте объект последовательного порта, сопоставленный с портом COM1. Осциллограф сконфигурирован к скорости в бодах 9 600, 1 стоп-бит, терминатор строки перевода строки, никакая четность и никакое управление потоками.

s = serial('COM1');
s.Baudrate=9600;
s.StopBits=1;
s.Terminator='LF';
s.Parity='none';
s.FlowControl='none';

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

fopen(s);

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

s.Status
ans = 
    open

Чтобы начаться, считывайте данные постоянно.

s.ReadAsyncMode='continuous';

Теперь, запросите инструмент для пика к пиковому значению сигнала на канале 1.

fprintf(s, 'Measurement:Meas1:Source CH1');
fprintf(s, 'Measurement:Meas1:Type Pk2Pk');
fprintf(s, 'Measurement:Meas1:Value?');

Позвольте время для ответа. В типовом приложении это - то, где вы могли сделать другие задачи.

pause(0.5);

Поскольку свойство ReadAsyncMode установлено в continuous, объект постоянно спрашивает инструмент, если какие-либо данные доступны. Если последняя функция fprintf завершается, инструмент начинает отправлять данные; данные считаны из инструмента и хранятся во входном буфере.

s.BytesAvailable
ans =
    14

Можно принести данные из входного буфера объекта в рабочее пространство MATLAB с fscanf.

data = fscanf(s)
data =
    5.99999987E-2

Затем, считайте данные вручную.

s.ReadAsyncMode='manual';

Теперь, запросите инструмент для частоты сигнала на канале 1.

fprintf(s, 'Measurement:Meas2:Source CH1');
fprintf(s, 'Measurement:Meas2:Type Freq');
fprintf(s, 'Measurement:Meas2:Value?');

Позвольте время для ответа. В типовом приложении это - то, где вы могли сделать другие задачи.

pause(0.5);

Если последняя функция fprintf завершается, инструмент начинает отправлять данные. Однако, поскольку ReadAsyncMode установлен в manual, объект не считывает данные, отправляемые от инструмента. Поэтому никакие данные не считываются и помещаются во входной буфер.

s.BytesAvailable
ans =
     0

Считайте данные.

readasync(s);

Позвольте время для ответа.

pause(0.5);

Важно помнить, что, когда объект последовательного порта находится в ручном режиме (свойство ReadAsyncMode сконфигурировано к manual), данные, которые отправляются с инструмента на компьютер, не автоматически хранимы во входном буфере связанного объекта последовательного порта. Данные не хранимы до readasync или одной из функций чтения блокирования называется.

Ручной режим должен использоваться, когда поток данных отправляется от вашего инструмента, и вы только хотите получить фрагменты данных.

Определение асинхронного коллбэка чтения

При продолжении примера от предыдущего раздела сконфигурируйте последовательный объект уведомить вас, когда терминатор строки будет считан.

s.ReadAsyncMode='continuous';
s.BytesAvailableFcn={'dispcallback'};

Отметьте, значение по умолчанию для свойства BytesAvailableFcnMode указывает, что функция обратного вызова, заданная свойством BytesAvailableFcn, будет выполняться, когда терминатор строки был считан.

s.BytesAvailableFcnMode
ans =
    terminator

Функция dispcallback отображает сообщение, содержащее тип события, имя объекта, который заставил событие происходить, и время, которое имело место событие.

 callbackTime = datestr(datenum(event.Data.AbsTime));
 fprintf(['A ' event.Type ' event occurred for ' obj.Name ' at ' 
     callbackTime '.\n']);

Запросите инструмент в течение периода сигнала на канале 1. Если терминатор строки читается из инструмента и помещается во входной буфер, dispcallback выполняется, и сообщение добавлено к окну команды MATLAB, указывающему, что событие BytesAvailable имело место.

fprintf(s, 'Measurement:Meas3:Source CH1')
fprintf(s, 'Measurement:Meas3:Type Period')
fprintf(s, 'Measurement:Meas3:Value?')

Позвольте время для ответа.

pause(0.5);
A BytesAvailable event occurred for Serial-COM1 at <date and time>.
s.BytesAvailable
ans =
    7
data = fscanf(s, '%c', 10)
data =

    2.0E-6

Обратите внимание на то, что последнее чтение значения является переводом строки (10).

Теперь предположите, что на полпути посредством асинхронной операции чтения, вы понимаете, что сигнал, отображенный на осциллографе, был неправильным. Вместо того, чтобы ожидать асинхронной операции, чтобы завершиться, можно использовать функцию stopasync, чтобы остановить асинхронное чтение. Обратите внимание на то, что, если бы асинхронная запись происходила, асинхронная операция записи была бы также остановлена.

s.BytesAvailableFcn='';
fprintf(s, 'Curve?');
pause(0.25);
S.BytesAvailable

ans =
    126

stopasync(s);
s.BytesAvailable

ans =
    262

Данные, которые были считаны из инструмента, остаются во входном буфере. Можно использовать одну из синхронных функций чтения, чтобы принести эти данные в рабочее пространство MATLAB. Однако, поскольку эти данные представляют неправильный сигнал, функция flushinput вызвана, чтобы удалить все данные из входного буфера.

flushinput(s);
s.BytesAvailable

ans =
    0

Можно выполнить асинхронную запись с fprintf или функциями fwrite путем передачи 'async' как последнего входного параметра.

fprintf(s, 'Measurement:Meas3:Value?', 'async')

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

fclose(s);
delete(s);
clear s

Правила для завершения записи и операций чтения

Правила для завершения синхронных и асинхронных операций чтения и операций записи описаны ниже.

Завершение операций записи

Операция записи с помощью fprintf или fwrite завершается, когда одно из этих условий удовлетворено:

  • Заданные данные записаны.

  • Прошло время, заданное как свойство Timeout.

В дополнение к этим правилам можно остановить асинхронную операцию записи в любое время с функцией stopasync.

Текстовая команда обрабатывается инструментом только, когда это получает необходимый терминатор строки. Для объектов последовательного порта каждое вхождение \n в команде ASCII заменяется значением свойства Terminator. Поскольку форматом по умолчанию для fprintf является %s\n, все команды, записанные в инструмент, закончатся значением Terminator. Значение по умолчанию Terminator является символом перевода строки. Терминатор строки, требуемый вашим инструментом, будет описан в его документации.

Завершение операций чтения

Операция чтения с fgetl, fgets, fscanf или readasync завершается, когда одно из этих условий удовлетворено:

  • Считался терминатор строки, заданный как свойство Terminator.

  • Прошло время, заданное как свойство Timeout.

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

  • Конкретное количество значений читается (только fscanf и readasync).

Операция чтения с fread завершается, когда одно из этих условий удовлетворено:

  • Прошло время, заданное как свойство Timeout.

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

Примечание

Установите свойство терминатора строки на '' (пустой указатель), при необходимости гарантировать эффективную пропускную способность двоичных данных.

В дополнение к этим правилам можно остановить асинхронную операцию чтения в любое время с функцией stopasync.

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

Этот пример иллюстрирует, как связаться с инструментом последовательного порта путем записи и чтения текстовых данных.

Инструментом является Tektronix® TDS 210 двухканальный осциллограф, соединенный с последовательным портом COM1. Поэтому многие приведенные ниже команды характерны для этого инструмента. Синусоида вводится в канал 2 из осциллографа, и ваше задание должно измерить напряжение от пика к пику входного сигнала.

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

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

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

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

Примечание

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

Примечание

Этим примером является конкретный Windows.

  1. Создайте объект последовательного порта — Создают объект последовательного порта s, сопоставленный с последовательным портом COM1.

    s = serial('COM1');
  2. Соединитесь с инструментом — Подключение s к осциллографу. Поскольку значением по умолчанию для свойства ReadAsyncMode является continuous, данные асинхронно возвращены во входной буфер, как только это доступно от инструмента.

    fopen(s)
  3. Запишите и считайте данные — Запись команда *IDN? к инструменту с помощью fprintf, и затем считайте назад результат команды с помощью fscanf.

    fprintf(s,'*IDN?')
    s.BytesAvailable
    ans =
        56
    idn = fscanf(s)
    idn =
    TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04

    Необходимо определить источник измерения. Возможные источники измерения включают канал 1 и канал 2 из осциллографа.

    fprintf(s,'MEASUREMENT:IMMED:SOURCE?')
    source = fscanf(s)
    source =
    CH1

    Осциллограф сконфигурирован, чтобы возвратить измерение в канал 1. Поскольку входной сигнал соединяется с каналом 2, необходимо сконфигурировать инструмент, чтобы возвратить измерение в этот канал.

    fprintf(s,'MEASUREMENT:IMMED:SOURCE CH2')
    fprintf(s,'MEASUREMENT:IMMED:SOURCE?')
    source = fscanf(s)
    source =
    CH2

    Можно теперь сконфигурировать осциллограф, чтобы возвратить напряжение от пика к пику, и затем запросить значение этого измерения.

    fprintf(s,'MEASUREMENT:MEAS1:TYPE PK2PK')
    fprintf(s,'MEASUREMENT:MEAS1:VALUE?')

    Передайте данные от входного буфера до рабочего пространства MATLAB с помощью fscanf.

    ptop = fscanf(s)
    ptop =
    2.0199999809E0
  4. Разъединитесь и вымойтесь — Когда вам больше не нужен s, необходимо отключить его от инструмента и удалить его из памяти и из рабочего пространства MATLAB.

    fclose(s)
    delete(s)
    clear s

Указания по применению для записи данных о ASCII

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

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

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

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

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

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

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

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

s.OutputBufferSize
ans = 
    512

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

s.ValuesSent
ans = 
    40

Указания по применению для чтения данных о ASCII

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

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

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

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

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

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

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

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

s.InputBufferSize
ans = 
    512

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

s.ValuesReceived
ans = 
    6

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

Этот пример исследует бинарные операции чтения и операции записи с объектом последовательного порта. Используемый инструмент был осциллографом Tektronix® TDS 210.

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

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

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

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

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

Примечание

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

Конфигурирование и соединение с последовательным объектом

Необходимо создать последовательный объект. В этом примере создайте объект последовательного порта, сопоставленный с портом COM1.

s = serial('COM1');

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

fopen(s)

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

s.Status
ans = 
    open

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

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

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

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

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

Примечание

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

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

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

s.OutputBufferSize
ans = 
    512

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

Сконфигурируйте размер буфера вывода объекта к 3 000. Отметьте, OutputBufferSize может быть сконфигурирован только, когда объект не соединяется с инструментом.

fclose(s);
s.OutputBufferSize = 3000;
fopen(s);

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

s.ValuesSent
ans = 
    581

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

Запишите форму волны как массив int16.

fwrite(s, 'Data:Destination RefB');
fwrite(s, 'Data:Encdg SRPbinary');
fwrite(s, 'Data:Width 2');
fwrite(s, 'Data:Start 1');

t = (0:499) .* 8 * pi / 500;
data = round(sin(t) * 90 + 127);
fwrite(s, 'CURVE #3500');

Обратите внимание на то, что одно значение int16 состоит из двух байтов. Поэтому следующая команда запишет 1 000 байтов.

fwrite(s, data, 'int16')

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

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

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

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

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

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

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

Примечание

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

Бинарные свойства чтения

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

s.InputBufferSize
ans = 
    512

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

s.ValuesReceived
ans = 
    256

Чтение int16 Двоичные данные

Считайте ту же форму волны на канале 1 как массив int16.

fread(s, 'Data:Source CH1');
fread(s, 'Data:Encdg SRPbinary');
fread(s, 'Data:Width 2');
fread(s, 'Data:Start 1');
fread(s, 'Data:Stop 2500');
fread(s, 'Curve?')

Обратите внимание на то, что одно значение int16 состоит из двух байтов. Поэтому следующая команда считает 512 байтов.

data = fread(s, 256, 'int16'):

Очистка

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

fclose(s)
delete(s)
clear s