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

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

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

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

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

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

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

Инструмент определяет, завершена ли операция записи на основе EOSMode, EOIMode и значений свойств EOSCharCode. Если EOSMode сконфигурирован или к write или к read&write, каждое вхождение \n в текстовой команде заменяется символом Конца строки (EOS), заданным значением EOSCharCode. Поэтому, когда вы используете формат fprintf по умолчанию %s\n, все текстовые команды, записанные в инструмент, закончатся тем значением. Значением EOSCharCode по умолчанию является LF, который соответствует символу перевода строки. Символ EOS, требуемый вашим инструментом, будет описан в его документации.

Если EOIMode является on, то строка Конца или идентифицирует (EOI) утверждается, когда последний байт записан в инструмент. Последний байт может быть частью потока двоичных данных или текстового потока данных. Если EOSMode сконфигурирован или к write или к read&write, то последний записанный байт является значением EOSCharCode, и строка EOI утверждается, когда инструмент получает этот байт.

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

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

  • Строка EOI утверждается.

  • Терминатор строки, заданный свойством EOSCharCode, читается. Это может произойти только, когда свойство EOSMode сконфигурировано или к read или к read&write.

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

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

  • Входной буфер заполнен (если количество значений не задано).

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

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

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

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

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

СвойствоЦель
ValuesReceivedЗадает общее количество значений, считанных из инструмента.
ValuesSentЗадает общее количество значений, отправленных в инструмент.
InputBufferSizeЗадает общее количество байтов, которые могут быть поставлены в очередь во входном буфере когда-то.
OutputBufferSizeЗадает общее количество байтов, которые могут быть поставлены в очередь в буфере вывода когда-то.
EOSModeКонфигурирует режим завершения Конца Строки.
EOSCharCodeЗадает терминатор строки Конца Строки.
EOIModeВключает или отключает утверждение режима EOI в конце операции записи.

Примечание

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

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

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

  1. Создайте инструментальный объект — Создают объект GPIB g, сопоставленный с Национальным контроллером Instruments® GPIB с параметром плат 0 и инструментом с первичным адресом 1.

    g = gpib('ni',0,1);
  2. Соединитесь с инструментом — Подключение g к осциллографу и возвратите значения по умолчанию для свойств EOSMode и EOIMode.

    fopen(g)
    get(g,{'EOSMode','EOIMode'})
    ans = 
        'none'    'on' 

    Используя эти значения свойств, завершаются операции записи, когда последний байт записан в инструмент и операции чтения, завершенные, когда строка EOI утверждается инструментом.

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

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

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

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

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

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

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

    fprintf(g,'MEASUREMENT:MEAS1:TYPE PK2PK')
    fprintf(g,'MEASUREMENT:MEAS1:VALUE?')
    ptop = fscanf(g)
    ptop =
    2.0199999809E0
  4. Разъединитесь и вымойтесь — Когда вам больше не нужен g, необходимо отключить его от инструмента и удалить его из памяти и из рабочей области IEEE.

    fclose(g)
    delete(g)
    clear g

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

По умолчанию строка Конца или идентифицирует (EOI) утверждается, когда последний байт записан в инструмент. Этим поведением управляет свойство EOIMode. Когда EOIMode установлен в on, строка EOI утверждается, когда последний байт записан в инструмент. Когда EOIMode установлен в off, строка EOI не утверждается, когда последний байт записан в инструмент.

Строка EOI может также утверждаться, когда терминатор строки записан в инструмент. Терминатор строки задан свойством EOSCharCode. Когда EOSMode сконфигурирован к write или read&write, строка EOI утверждается, когда значение свойства EOSCharCode записано в инструмент.

Все случаи \n в команде, записанной в инструмент, заменяются значением свойства EOSCharCode, если EOSMode установлен в write или read&write.

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

  • Строка EOI утверждается

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

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

Примечание

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

Следующий пример иллюстрирует, как можно загрузить отображение на экране осциллографа TDS 210 на программное обеспечение IEEE. Данные об отображении на экране передаются программному обеспечению IEEE и сохранили использование на диск растрового формата Windows®. Эти данные обеспечивают постоянную запись вашей работы и являются простым способом зарегистрировать важный сигнал и параметры осциллографа:

  1. Создайте инструментальный объект — Создают объект GPIB g, сопоставленный с Национальным Инструментальным контроллером GPIB с параметром плат 0 и инструментом с первичным адресом 1.

    g = gpib('ni',0,1);
  2. Сконфигурируйте значения свойств — Конфигурируют входной буфер, чтобы принять довольно большое количество байтов и сконфигурировать значение тайм-аута к двум минутам, чтобы составлять медленную передачу данных.

    g.InputBufferSize = 50000;
    g.Timeout = 120;
  3. Соединитесь с инструментом — Подключение g к осциллографу.

    fopen(g)
  4. Запишите и считайте данные — Конфигурируют осциллограф, чтобы передать отображение на экране как битовый массив.

    fprintf(g,'HARDCOPY:PORT GPIB')
    fprintf(g,'HARDCOPY:FORMAT BMP')
    fprintf(g,'HARDCOPY START')

    Асинхронно передайте данные от инструмента до входного буфера.

    readasync(g)

    Ожидайте, пока операция чтения не завершается, и затем передайте данные рабочей области IEEE как 8-битные целые числа без знака.

    g.TransferStatus
    ans =
    idle
    out = fread(g,g.BytesAvailable,'uint8');
  5. Разъединитесь и вымойтесь — Когда вам больше не нужен g, необходимо отключить его от инструмента и удалить его из памяти и из рабочей области IEEE.

    fclose(g)
    delete(g)
    clear g

Просмотр растровых данных

Чтобы просмотреть растровые данные, необходимо выполнить эти шаги:

  1. Откройте дисковый файл.

  2. Запишите данные в дисковый файл.

  3. Закройте дисковый файл.

  4. Считайте данные с помощью функции imread.

  5. Масштабируйте и отобразите данные с помощью функции imagesc.

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

fid = fopen('test1.bmp','w');
fwrite(fid,out,'uint8');
fclose(fid)
a = imread('test1.bmp','bmp');

Отобразите изображение.

imagesc(a)

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

c = colormap(gray);
colormap(flipud(c));

Изображение полученного растрового изображения показывают ниже.

Парсинг Входных данных Используя scanstr

Этот пример иллюстрирует, как использовать функцию scanstr, чтобы проанализировать данные, которые вы считываете из осциллографа Tektronix TDS 210. scanstr особенно полезен когда это необходимо, чтобы проанализировать строку в один или несколько элементов массива ячеек, где каждый элемент полон решимости быть или двойным или вектором символов:

  1. Создайте инструментальный объект — Создают объект GPIB g, сопоставленный с Национальным Инструментальным контроллером GPIB с параметром плат 0 и инструментом с первичным адресом 1.

    g = gpib('ni',0,1);
  2. Соединитесь с инструментом — Подключение g к осциллографу.

    fopen(g)
  3. Запишите и считайте данные — Возвращают идентификационную информацию, чтобы разделить элементы массива ячеек с помощью разделителей по умолчанию.

    fprintf(g,'*IDN?');
    idn = scanstr(g)
    idn = 
        'TEKTRONIX'
        'TDS 210'
        [        0]
        'CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04'
  4. Разъединитесь и вымойтесь — Когда вам больше не нужен g, необходимо отключить его от инструмента и удалить его из памяти и из рабочего пространства MATLAB.

    fclose(g)
    delete(g)
    clear g

Понимание EOI и EOS

Этот пример иллюстрирует, как строка EOI и символ EOS используются, чтобы завершить операции чтения и операции записи, и как EOIMode, EOSMode и свойства EOSCharCode связаны друг с другом. В большинстве случаев можно успешно связаться с инструментом путем принятия значений по умолчанию для этих свойств.

Значением по умолчанию для EOIMode является on, что означает, что строка EOI утверждается, когда последний байт записан в инструмент. Значением по умолчанию для EOSMode является none, что означает, что значение EOSCharCode не записано в инструмент, и операции чтения не завершатся, когда значение EOSCharCode будет считано. Поэтому, когда вы используете значения по умолчанию для EOIMode и EOSMode,

  • Операции записи завершаются, когда последний байт записан в инструмент.

  • Операции чтения завершаются, когда строка EOI утверждается инструментом.

  1. Создайте инструментальный объект — Создают объект GPIB g, сопоставленный с Национальным Инструментальным контроллером GPIB с параметром плат 0 и инструментом с первичным адресом 1.

    g = gpib('ni',0,1);
  2. Соединитесь с инструментом — Подключение g к осциллографу.

    fopen(g)
  3. Запишите и считайте данные — Конфигурируют g так, чтобы строка EOI не утверждалась после того, как последний байт записан в инструмент, и символ EOS используется, чтобы завершить операции записи. Форматом по умолчанию для fprintf является %s\n, где \n заменяется символом EOS, как дано EOSCharCode.

    g.EOIMode = 'off';
    g.EOSMode = 'write';
    fprintf(g,'*IDN?')
    out = fscanf(g)
    out =
    
    TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04

    Несмотря на то, что EOSMode сконфигурирован так, чтобы операции чтения не завершались после получения символа EOS, предыдущая операция чтения, за которой следуют, потому что строка EOI утверждалась.

    Теперь сконфигурируйте g так, чтобы символ EOS не использовался, чтобы завершить операции чтения или операции записи. Поскольку строка EOI не утверждается, и символ EOS не записан, инструмент не может интерпретировать команду *IDN?, и тайм-аут происходит.

    g.EOSMode = 'none';
    fprintf(g,'*IDN?')
    out = fscanf(g)
    
    Warning: GPIB: NI: An I/O operation has been canceled mostly 
    likely due to a timeout.

    Теперь сконфигурируйте g так, чтобы операция чтения остановилась после “X” читается символ. Свойство EOIMode сконфигурировано к on так, чтобы строка EOI утверждалась после того, как последний байт записан. Свойство EOSMode сконфигурировано к read так, чтобы операция чтения завершилась, когда значение EOSCharCode читается.

    g.EOIMode = 'on';
    g.EOSMode = 'read';
    g.EOSCharCode = 'X';
    fprintf(g,'*IDN?')
    out = fscanf(g)
    out =
    
    TEKTRONIX

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

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

    fclose(g)
    delete(g)
    clear g