Эти функции сопоставлены с чтением и записью текста асинхронно:
Функция | Цель |
---|---|
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.
Создайте объект последовательного порта — Создают объект последовательного порта s
, сопоставленный с последовательным портом COM1.
s = serial('COM1');
Соединитесь с инструментом — Подключение s
к осциллографу. Поскольку значением по умолчанию для свойства ReadAsyncMode
является continuous
, данные асинхронно возвращены во входной буфер, как только это доступно от инструмента.
fopen(s)
Запишите и считайте данные — Запись команда *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
Разъединитесь и вымойтесь — Когда вам больше не нужен 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
.
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
Считайте ту же форму волны на канале 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