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

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

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

Глава 1. ОБЩИЕ ВОПРОСЫ СТАНДАРТИЗАЦИИ ПОСЛЕДОВАТЕЛЬНЫХ ИНТЕРФЕЙСОВ И МЕТОДИКА ИХ ПРОГРАММИРОВАНИЯ

Последовательные интерфейсы и последовательный порт: стандарты и соглашения

Стандарт RS-232 предназначен для обмена данными между оконечными устройствами, в число которых входит порт компьютера. Стандарт закрепляет условия, которые необходимо соблюдать при подключении аппаратуры приема-передачи, такие как электрический интерфейс и типы разъемов, сигналы управления, структуру сигнала передачи данных. Стандарт не оговаривает подключение модема в структуру канала.

Исторически стандарт претерпел три основных этапа развития: RS-232C, RS-232D и RS-232E. Часть «С» была принята в 1969 г. и

включает описание характеристик потенциальных электрических сигналов несимметричной линии связи. Части D (1986 г.) и Е (1991 г.) появились уже под названием EIA-232D/E и описывают в том числе ряд дополнительных линий тестирования, различные разъемы, включая разъем DB-25, и рекомендации применения. Стандарт RS-232 правильнее именовать EIA/TIA-232 (с 1988 г.

стандарт поддержала Telecommunications Industry Association ITU-T). Международный консультативный комитет по телеграфии и телефонии (CCITT) имеет такой же стандарт V.24/V.28 (действующий с 2000 г., с другими наименованиями линий). Существует аналогичный стандарт ISO 2110, в СССР он был зарегистрирован как ГОСТ 18144581. В настоящее время действует версия F стандарта (1997 г.), но большая часть современного оборудования ориентиро-

вана на RS-232D/E.

Короткий пример работы

споследовательным портом

Вданной главе рассматривается простой пример, который поможет понять основы работы с последовательным портом и наладить простой обмен данными между двумя программными пор-

тами.

11

Для начала работы необходимо создать пару программных по-

следовательных портов COM1 и COM2, соединенных между со-

бой. Для этой цели можно использовать ПО Eltima Virtual Serial Ports Driver XP. Затем необходимо создать объекты этих портов в

MATLAB

>> com1=serial('COM1')

Serial Port Object : Serial-COM1

Communication Settings

Port: COM1

BaudRate: 9600

Terminator: 'LF'

Communication State

Status: closed

RecordStatus: off

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 0

ValuesSent: 0

>> com2=serial('COM2')

Serial Port Object : Serial-COM2

Communication Settings

Port: COM2

BaudRate: 9600

Terminator: 'LF'

Communication State

Status: closed

RecordStatus: off

12

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 0

ValuesSent: 0

В результате выполнения предыдущих операторов было создано две структуры com1 и com2, поля которых содержат все свойства созданных портов. В области Workspace приводятся значения некоторых свойств созданных портов.

На следующем шаге необходимо открыть порты

>>fopen(com1)

>>fopen(com2)

Теперь проведем запись в порт com1:

>> fprintf(com1,'Data')

Оценим количество информации, которое было передано в буфер порта. Для этого необходимо прочесть значение свойства ValuesSent порта com1. Количество информации можно посмотреть в области Workspace, кликнув по соответствующему порту (com1), или прочесть свойство valuessent как части структуры com1:

>> com1.valuessent

ans =

5

В порт было передано четыре байта данных (коды четырех символов слова Data). В результате в буфере порта оказалось пять байт. Это произошло потому, что помимо данных был передан символ окончания передачи (Terminator), который присоединяется к концу данных. По умолчанию этот символ имеет значение кода символа

LF-перевода каретки (код 13 по кодировке ASCII):

>> com1.terminator

ans =

LF

13

Значение символа Terminator можно менять. Например:

>> com1.terminator='r'

Serial Port Object : Serial-COM1

Communication Settings

Port: COM1

BaudRate: 9600

Terminator: 'r'

Communication State

Status: open

RecordStatus: off

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 0

ValuesSent: 5

Вернем символу Terminator значение, принятое по умолчанию:

>> com1.terminator='LF'

Serial Port Object : Serial-COM1

Communication Settings

Port: COM1

BaudRate: 9600

Terminator: 'LF'

Communication State

Status: open

RecordStatus: off

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 0

ValuesSent: 5

14

Проведем чтение из буфера порта com2

>> dat=fscanf(com2)

dat =

Data

Из буфера порта было прочитано 5 байт (преданные данные и символ LF– окончания передачи):

>> com2.valuesreceived

ans =

5

Изменим символ окончания передачи только у одного из пары соединенных портов. Таким образом, символы завершения передачи двух портов будут различны:

>> com1.terminator='E'

Serial Port Object : Serial-COM1

Communication Settings

Port: COM1

BaudRate: 9600

Terminator: 'E'

Communication State

Status: open

RecordStatus: off

Read/Write State TransferStatus: idle BytesAvailable: 0 ValuesReceived: 0 ValuesSent: 5

Повторимпередачу слова 'Data':

>>fprintf(com1,'Data')

>>dat=fscanf(com2)

15

Warning: A timeout occurred before the Terminator was reached.

dat =

DataE

Процесс чтения затянулся на некоторое время, и было получено предупреждение: Время ожидание истекло до получения символа окончания передачи (Время ожидания определяется свойством Timeout принимающего порта и доступно для изменения). Но символ 'Е' был получен и распознан как информационный, но не служебный.

Установим значение свойства Timeout равным 1 секунде:

>> com2.timeout=1

Serial Port Object : Serial-COM2

Communication Settings

Port: COM2

BaudRate: 9600

Terminator: 'LF'

Communication State

Status: open

RecordStatus: off

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 10

ValuesSent: 0

Для устранения возникшего предупреждения нужно символ окончания передачи принимающего порта com2 установить таким же, как и у передающего порта com1:

>> com2.terminator='E'

Serial Port Object : Serial-COM2

16

Communication Settings

Port: COM2

BaudRate: 9600

Terminator: 'E'

Communication State

Status: open

RecordStatus: off

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 10

ValuesSent: 0

Произведем повторную передачу данных в порт com2 и чтение данных из буфера порта com2:

>>fprintf(com1,'Data')

>>dat=fscanf(com2)

dat =

DataE

В этот раз не пришлось ждать!

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

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

MATLAB).

Мы рассмотрели небольшой пример передачи данных на примере пары последовательных портов. Рассмотрим подробнее, как работать со свойствами объекта serial в MATLAB.

17

Значение любого свойства можно читать и изменять (если это разрешено), обращаясь к нему как к части структуры com1 или com2. Свойство baudrate позволяет контролировать скорость передачи в линии порта в единицах [Бод]:

>> com1.baudrate

ans =

9600

>> com1.baudrate=19200

Serial Port Object : Serial-COM1

Communication Settings

Port: COM1

BaudRate: 19200

Terminator: 'E'

Communication State

Status: open

RecordStatus: off

Read/Write State

TransferStatus: idle

BytesAvailable: 0

ValuesReceived: 0

ValuesSent: 15

В примере была считана, а затем установлена новая скорость передачи данных через порт 19200 Бод.

Механизм обмена данными

через последовательный порт (по протоколу RS-232)

Механический стандарт

Интерфейс RS-232 выпускался с разъемами двух типов: DB-9 и DB-25, в форме трапеции с 9 и 25 контактами (pin, анг.) соответственно. В настоящее время используется разъем RJ-45. Распределение сигналов по контактам для разъема DB-9 приведено на рис. 1 и

18

в табл. 1, для разъема RJ-45 приведено на рис. 2 и в табл. 2 . При программировании последовательных портов мы будем указывать значение логического сигнала на соответствующем контакте. Значению «1» – логической единицы или логического «0» будут соответствовать термины «сигнал установлен» или «сигнал не установлен» соответственно.

Рассмотрим назначение контактов более подробно. Стандарт определяет устройства двух типов: DTE – оконечное оборудование приемника – передатчика и DCE – оборудование ретранслятора. Помимо защитного заземления (экрана FG), расположенного вокруг проводников, один из девяти контактов отведен под сигнальное заземление (нулевой провод GND), контакты RxD и TxD подключены к выводам передатчика и приемника сигнала соответственно. Остальные контакты используются в целях арбитража передачи и контроля работоспособности линии связи.

Рис. 1. Расположение контактов разъема DB-9

 

 

Контакты DB-9

Таблица 1

 

 

 

 

 

 

 

Обозначение

Назначение

Операция

кон-

контакта

сигнала или контакта

R-чтения

такта

 

 

W-записи

1

DCD

Для сигнализации обнаружения

R

 

 

несущей частоты

 

2

RxD

Вход приемника данных

R

3

TxD

Выход передатчика данных

W

4

DTR

Сигнал готовности порта

WR

5

GND

Контакт «земля» для сигнала

 

6

DSR

Сигнал готовности

R

 

 

подключенного устройства

 

7

RTS

Запрос передачи

WR

8

CTS

Сигнал готовности к передаче

R

9

RI

Индикатор звонка (для модема)

R

19

Сигнал DCD (Data Carrier Detect) поступает от устройства, которое обнаружило на входе своего приемника данные. Как правило, используется модемом. Этот сигнал выступает в роли индикатора и может быть только считан. Если терминал готов к обмену данными, то он на значение сигнал DCD «Истина» должен выставить сигнал готовности терминала к обмену данными DTR со значением «Истина», после чего начинается обмен данными.

Сигнал CTS (Clear to Send очищен для передачи) – устанавливается устройством DCE, когда оно подтверждает готовность к приему данных по сигналу TxD. Для устройства DTE этот бит программно доступен только в режиме чтения. Обычно этот сигнал выставляет конечное устройство после того, как оно получит от компьютера сигнал RTS со значением «Истина» (запрос на передачу) и будет готово принять данные от компьютера. Если конечное устройство не выставит сигнал CTS со значением «Истина», то передача по линии TxD не начнется. Сигнал CTS используется для аппаратного управления потоками данных

Устройство DTE устанавливает сигнал DTR (Data Terminal Ready), когда желает открыть канал связи. Если устройство DCE является модемом, установка сигнала DTE принуждает модем подключиться к линии, а после подключения поддерживать связь. Сброс сигнала DTR воспринимается модемом как команда завершения соединения.

Сигнал DSR (Data Set Ready) – устанавливается, когда подключенное к порту устройство (другой порт или модем) завершило настройки, активно и ожидает данные. Устройство DTE считывает бит DSR, но не может программно его изменить. Поскольку сигнал DSR формирует устройство DCE, иногда аббревиатуру DSR расшифровывают как «DCE Ready».

Сигнал RI (Ring Indicator) – устанавливается, когда подключенный к порту модем принимает сигнал вызова с телефонной линии. Этот бит программно изменить нельзя.

Сигнал RTS (Request To Send) устанавливают, когда порт (DTE устройство) готов к передаче информации и требует от DCE устройства подготовиться к приему данных. Его значение можно узнать и изменить через свойство RequestToSend. Устройство DCE подтверждает готовность к передаче сигналом CTS.

20

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