Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Сафоненко Практикум по интерфейсам последователной передачи 2012

.pdf
Скачиваний:
2
Добавлен:
12.11.2022
Размер:
4.56 Mб
Скачать

зирует о возможности/невозможности передачи. Изменение бита CTS можно производить с помощью события (прерывания).

Рис. 9. Соединение двух устройств для передачи с управлением передачей

При программном методе управление происходит передачей кодов символов «Xon» и «Xoff» (соответственно 11h и 13h по кодировке ASCII) по линиям передачи данных. Если требуется остановить передачу, приемник передает код Xoff, а для возобновления – Xon. Для этого метода достаточно четырех проводников, соединенных по схеме рис. 8 без применения сигналов квитирования RTS– CTS, DTR–DSR. В этом случае скорость передачи данных не соответствует установленной.

Следующая команда отключает режимы коммутации,

>> com1.flowcontrol='none';

если управления передачей не требуется.

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

Соединим два последовательных порта по схеме рис. 9. Установим (эти значения приняты по умолчанию):

>>com1.flowcontrol='none';

>>com2.flowcontrol='none';

51

Осуществим следующий механизм: бит RTS будет индикатором запроса передачи данных, бит DTR будет отвечать за возможность приема данных.

Пусть порты готовы, включим прием:

>>com1.dataterminalready='on';

>>com2.dataterminalready='on';

Этот бит соединен с DSR битом противоположного порта. Бит DSR противоположного порта будет также установлен:

>>com1.pinstatus.DataSetReady ans =

on

>>com2.pinstatus.DataSetReady ans =

on

Необходимо обратить внимание, на то, что PinStatus является структурой объекта serial, и в записи полей – свойств структуры следует соблюдать строчные и прописные буквы D, S и R.

Теперь известим противоположный порт о готовности передачи:

>>com1.requesttosend='on';

>>com2.requesttosend='on';

Биты CTS на противоположных портах будут установлены:

>>com1.pinstatus.ClearToSend ans =

on

>>com2.pinstatus.ClearToSend ans =

on

Теперь можно начинать передачу в обе стороны!

Если во время передачи com1 не может принимать данные по каким-либо причинам, то с его стороны выполняется команда:

>> com1.dataterminalready='off';

52

Со стороны com2 необходимо периодически проверять сигнал

DataSetReady(DSR):

>> com2.pinstatus.DataSetReady ans =

off

И в случае, когда он равен «off», необходимо остановить передачу до тех пор, пока значение этого сигнала не изменится на «on».

Если во время передачи com1 не может передавать данные по каким-либо причинам, то с его стороны выполняется команда:

>> com1.requesttosend='off';

На стороне com2 периодически проверяем сигнал ClearToSend:

>> com2.pinstatus.ClearToSend ans =

off

Когда сигнал станет «on» равен «off», необходимо остановить прием данных до тех пор, пока значение этого сигнала не измениться на «on».

Механизм управления передачей можно использовать в качестве сигнала переполнения входного буфера принимающего порта.

Операторы MATLAB чтения и записи данных в порт

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

53

fprintf

Синтаксис оператора fprintf схож с оператором printf языка C. Этот оператор посылает информацию в виде текстовой строки. Формат записи оператора:

fprintf(obj,format,cmd,mode)

obj – ссылка на экземпляр объекта порта,

format – формат вывода строки, подобный формату оператора printf языка C (по умолчанию '%s\n'),

cmd – матрица с подставляемыми значениями,

mode – режим записи: синхронный ('sync') или асинхронный

('async') (по умолчанию 'sync').

>>cmd=[1 2];

>>fprintf(com1,'com%d -> com%d\n',cmd)

>>fscanf(com2)

ans =

com1 -> com2

В конце поля «формат» нужно добавить символ окончания передачи (в данном случае '\n' (или 'LF')), чтобы принимающее устройство не ожидало его появления (в случае если этого символа нет).

fwrite

Оператор fwrite производит запись числовых данных. Синтаксис оператора:

fwrite(obj,cmd,precision,mode)

obj – ссылка на экземпляр объекта порта,

precision – тип, к которому преобразуются данные при выводе (по умолчанию 'uchar'),

cmd – матрица с подставляемыми значениями,

mode – режим записи: синхронный ('sync') или асинхронный

('async') (по умолчанию 'sync').

Возможные значения для precision: 'uchar' – беззнаковый символ (8 бит), 'schar' – знаковый символ (8 бит), 'int8' – целое число со знаком (8 бит), 'int16' – целое число со знаком (16 бит), 'int32' – целое число со знаком (32 бита), 'uint8' – беззнаковое целое число

54

(8 бит), 'uint16' беззнаковое целое число (16 бит), 'uint32' – беззнаковое целое число (32 бита), 'single' – число с плавающей точкой (32 бита), 'float32' – число с плавающей точкой (32 бита), 'double' – число с плавающей точкой (64 бита), 'float64' – число с плавающей точкой (64 бита), 'char' – символ (со знаком или без, 8 бит), 'short' – целое число (16 бит), 'int' – целое число (32 бита), 'long' – целое число (32 или 64 бита), 'ushort' – целое число без знака (16 бит), 'uint' – целое число без знака (32 бита), 'ulong' – целое число без знака (32 или 64 бита), 'float' – число с плавающей точкой (32 бита).

>>cmd=[1.33 10^-100 0 1 -14];

>>fwrite(com1,cmd,'int8')

>>fread(com2)

Warning: The specified amount of data was not returned within the Timeout period.

ans =

1

0

0

1

242

По умолчанию fread читает в формате целое число без знака (8 бит), а 242 в этом формате соответствует -14 в формате со знаком. Как видно, при записи все значения были преобразованы к типу int8.

Кроме того, этот оператор можно использовать и для записи чи-

сел с плавающей точкой:

>>cmd=[2.27 10^-1 0 2 -87];

>>fwrite(com1,cmd,'float32')

>>fread(com2,5,'float32')

ans =

2.2700

0.1000

0

55

2.0000 -87.0000

Для чтения информации можно использовать один из следую-

щих операторов: fscanf, fread, fgetl, fgets.

fscanf

Этот оператор схож с оператором scanf языка C. Формат записи этого оператора:

[A,count,msg]=fscanf(obj,format,size)

A – матрица, в которую будут считаны данные, count – количество считанных значений,

msg – сообщение об ошибке или предупреждение, выдаваемое в случае неудачной операции чтения,

obj – ссылка на экземпляр объекта порта,

format – формат вывода строки, подобный формату оператора scanf языка C (по умолчанию '%c\n'),

size – размер матрицы A, может принимать значение числа N (тогда матрица A будет представлять собой вектор-столбец длиной N) или матрицы [M, N] (тогда матрица A будет заполнена по столбцам считанными значениями):

>>cmd=[1 2];

>>fprintf(com1,'com%d -> com%d\n',cmd)

>>fscanf(com2,'com%d -> com%d\n')

ans =

1

2

Перенаправление вывода сообщения и отсутствие символа '\n' проиллюстрируем следующим примером:

>>fprintf(com1,'com%d -> com%d',cmd)

>>[A,count,msg]=fscanf(com2,'com%d -> com%d')

После некоторого ожидания, определенного в свойстве com2.timeout (так как не был указан символ окончания передачи):

56

A =

1

2

count =

12

msg =

A timeout occurred before the Terminator was reached.

Осуществим передачу чисел с плавающей точкой:

>>cmd=[1 1.2 2 1.2];

>>fprintf(com1,'com%d (%f) -> com%d (%f)\n',cmd)

>>fscanf(com2,'com%d (%f) -> com%d (%f)\n')

ans =

1.0000

1.2000

2.0000

1.2000

fread

Оператор читает данные заданного типа. Формат записи этого оператора:

[A,count,msg]=fread(obj,size,precision)

A – матрица, в которую будут считаны данные, count – количество считанных значений,

msg – сообщение об ошибке или предупреждение в случае сбоев операции чтения,

obj – ссылка на экземпляр объекта порта,

size – размер матрицы A, может принимать значение числа N (тогда матрица A будет представлять собой вектор-столбец длиной N) или матрицы [M, N] (тогда матрица A будет заполнена считанными значениями по столбцам),

57

precision – тип читаемых данных, соответствует описанию опе-

ратора fwrite.

>>cmd=[1.33 10^-100 0 1 -14];

>>fwrite(com1,cmd,'int8')

>>fread(com2,5,'int8')

ans =

1

0

0

1 -14

Осуществим прием чисел с плавающей точкой:

>>cmd=[2.27 10^-1 0 2 -87];

>>fwrite(com1,cmd,'double')

>>fread(com2,5,'double')

ans =

2.2700

0.1000

0

2.0000 -87.0000

fgetl

Оператор fgetl читает одну строку текста из порта, удаляя символ окончания передачи. Формат оператора:

[tline,count,msg]=fgetl(obj)

tline – строка, в которую будут считаны данные, count – количество считанных символов,

msg – сообщение об ошибке или предупреждение, выдаваемое в случае неудачной операции чтения,

obj – ссылка на экземпляр объекта порта.

>>com2.terminator='E';

>>fprintf(com1,'DataEdata')

58

>> fgetl(com2)

ans =

Data

Прочтем вторую частьсообщения

>> fgetl(com2)

Warning: A timeout occurred before the Terminator was reached.

ans =

data

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

fgets

Оператор fgets читает данные из порта построчно, сохраняя сим-

вол окончания передачи. Формат оператора:

[tline,count,msg]=fgets(obj)

tline – строка, в которую будут считаны данные, count – количество считанных символов,

msg – сообщение об ошибке или предупреждение, выдаваемое в случае неудачной операции чтения,

obj – ссылка наэкземпляр объектапорта.

>>com2.terminator='E';

>>fprintf(com1,'DataEdata')

>>fgets(com2)

ans =

DataE

>> fgets(com2)

Warning: A timeout occurred before the Terminator was reached.

59

ans =

data

В отличие от работы оператора fgetl, в данном примере был вы-

веден символ окончания передачи.

Операторы управления передачей

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

Можно избавить систему от подобного рода проверок и управлять передачей программно, уменьшив нагрузку на канал при передаче огромных массивов данных. Отказ от автоматической передачи осуществляется вызовом команды:

>> readasync(com1)

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

емного устройства InputBufferSize-BytesAvailable:

>> readasync(com1,512)

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

О факте асинхронного чтения/записи можно узнать, обратившись к свойству TransferStatus. Если его значение – idle, то это означает, что никаких асинхронных операций чтения или записи не происходит. Остальные значения read, write, read&write означают, что происходит, соответственно, асинхронное чтение, запись и чте- ние-запись одновременно.

Оператор stopasync останавливает асинхронные операции чтения и записи, вызванные операторами readasync, fprintf или fwrite.

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]