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

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

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

г) результаты моделирования; е) основные выводы о проделанной работе.

Варианты заданий

 

 

 

 

 

Таблица 1.1

Сигналы

 

Программные алгоритмы ввода-вывода

синхрони-

 

 

 

 

 

 

Синхронный

 

Асинхронный

Комбини-

зации

 

 

 

 

рованный

и обмена

 

 

 

 

 

Сигналы

1. RTS-CTS

1.

Прерывание по RTS-CTS

формирова-

2. DTR-DSR

2.

Прерывание по DTR-DSR

ния сеанса

3. break

3.

Прерывание по break

связи (А)

 

 

 

 

 

Сигналы

1.

Сигналы готовно-

1.

Сигнал преры-

1. Сигналы го-

приема –

сти регистров при-

вания по получе-

товности регист-

передачи

емника и передатчи-

нии данных

ров приемника и

данных

ка

 

2.

Сигнал преры-

передатчика

(Б)

2.

RTS-CTS запрос

вания по RTS,

2. Сигнал пре-

 

передачи, обмен – по

чтение данных по

рывания по RTS,

 

готовности регист-

флагу

чтение по готов-

 

ров приемника и

3.

Сигнал преры-

ности регистра

 

передатчика

вания по DTR,

приемника

 

3.

DTR –DSR запрос

чтение данных по

3. Сигнал пре-

 

передачи, обмен – по

флагу

рывания по

 

готовности регист-

4.

Сигнал преры-

DTR, чтение по

 

ров приемника и

вания таймера,

готовности реги-

 

передатчика

чтение данных по

стра приемника

 

 

 

флагу

 

Протокол

1.

Симплексный

 

 

 

обмена (В)

2.

Полудуплексный

 

 

 

 

3.

Дуплексный

 

 

 

Обеспечить контроль числа полученных символов

Таблица 1.2

№ варианта

 

1

2

3

4

5

6

7

8

9

Программный алгоритм

 

 

 

Синхронный

 

 

 

ввода-вывода

 

 

 

 

 

 

 

 

 

 

Сигналы

А

1

1

1

2

2

2

3

3

3

синхронизации

 

 

 

 

 

 

 

 

 

 

Б

1

2

3

1

2

3

1

2

3

и обмена

 

 

 

 

 

 

 

 

 

 

131

Таблица 1.3

№ варианта

10

 

11

12

13

14

15

 

16

17

18

19

20

 

21

Программный алго-

 

 

 

 

 

 

 

Асинхронный

 

 

 

 

 

 

 

ритм ввода-вывода

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сигналы син-

 

А

1

 

1

1

1

2

 

2

 

2

2

3

3

3

 

3

хронизации

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Б

1

 

2

3

4

1

 

2

 

3

4

1

2

3

 

4

и обмена

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 1.4

 

 

 

 

 

 

 

 

 

 

25

 

 

 

 

 

 

 

 

 

 

№ варианта

 

 

 

 

22

 

23

24

 

 

 

26

 

27

 

28

 

29

30

Программный

алгоритм

 

 

 

 

 

 

Комбинированный

 

 

 

 

 

ввода-вывода

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сигналы синхрониза-

А

 

1

 

1

 

1

 

2

 

 

2

 

2

 

3

 

3

 

3

ции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Б

 

1

 

2

 

3

 

1

 

 

2

 

3

 

1

 

2

 

3

и обмена

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример выполнения работы по варианту № 8

#include<dos.h>

#include<bios.h> #include <conio.h> #include <stdlib.h>

///////////Сигналы COM порта////////////////

#define DTR 0x01//OUT Data Terminal Ready #define DSR 0x20//IN Data Set Ready #define RTS 0x02//OUT Request To Send #define CTS 0x10//IN Clear To Send

#define TOUT 0x80// Time Out

#define TREADY 0x20 // Готовностьпередатчика

#define RREADY 0x01 // Готовностьприемника

//////////Переменные состояния//////////////

char DTR_ON = 0; //OUT Data Terminal Ready char DSR_ON = 0; //IN Data Set Ready

132

char RTS_ON = 0; //OUT Request To Send char CTS_ON = 0; //IN Clear To Send char BREAK_ON = 0; // Break

int BASE; // Adres porta

char out,in; //out – na peredachu in – na polucheniye int xo = 1,yo = 2,xi = 1,yi = 2; //okna vyvoda

//////////////////////////////////////////////

void ViewPort(void); void InitPort(void); void InitInterface(void);

char Receiver_Ready(void); char Transferer_Ready(void); char TimeOut(void);

char Receiver(void); void Transferer(char); void SetRTS(void); void ResetRTS(void); void SetBreak(void); void ResetBreak(void);

void ControlBoard(void); void Protocol(void);

//////////////////////////////////////////////

#define SETTINGS (_COM_9600 | _COM_CHR8 | _COM_STOP1 | _COM_NOPARITY)

//скорость9600 Бод, 8 бит на символ, одинстоп бит без контроля четности

void InitPort(void)

{

clrscr();

cprintf("COM PORT : 1,2 ?\r\n"); switch(getch())

{

case '1':

_bios_serialcom(_COM_INIT, 0, SETTINGS);

133

BASE = 0x3f8;

cprintf("COM1 is initialized\r\n"); break;

case '2':

_bios_serialcom(_COM_INIT, 1, SETTINGS); BASE = 0x2f8;

cprintf("COM2 is initialized\r\n"); break;

}

getch();

clrscr();

}

char Receiver_Ready(void) // Приемник получил данные

{

return (inportb(BASE + 5)&RREADY);

}

char Transferer_Ready(void) // Передатчик свободен

{

return (inportb(BASE + 5)&TREADY);

}

char TimeOut(void) // Time Out porta

{

return (inportb(BASE + 5)&TOUT);

}

char Receiver(void) // Чтение байта данных

{

char pocket;

pocket = inportb(BASE); return pocket;

}

void Transferer(char pocket) // Передать данные влинию

{

outportb(BASE, pocket);

}

134

void SetRTS() // RTS = 1 DTR = 1

{

outportb(BASE + 4,DTR|RTS); DTR_ON = 1;

RTS_ON = 1;

}

void ResetRTS() // RTS = 0 DTR = 1

{

outportb(BASE + 4,DTR); DTR_ON = 1;

RTS_ON = 0;

}

void SetBreak(void) // Break = 1,имитация обрыва линии

{

outportb(BASE + 3,inportb(BASE + 3)|0x40);

}

void ResetBreak(void) // Break = 0

{

outportb(BASE + 3,inportb(BASE + 3)&0xbf);

}

////Function of Viewing Port////////////////// void ViewPort(void) // Sostoyaniye porta

{

if (inportb(BASE + 6) & DSR) DSR_ON = 1;

else DSR_ON = 0;

if (inportb(BASE + 6) & CTS) CTS_ON = 1;

else CTS_ON = 0;

if (inportb(BASE + 5) & 0x10) BREAK_ON = 1;

else BREAK_ON = 0;

}

void ControlBoard(void) // Состояние сигналов

{

clrscr();

135

if (CTS_ON)

 

cprintf("CTS

[ON]\r\n");

else

 

cprintf("CTS

[OFF]\r\n");

if (DSR_ON)

 

cprintf("DSR

[ON]\r\n");

else

 

cprintf("DSR

[OFF]\r\n");

if (RTS_ON)

 

cprintf("RTS

[ON]\r\n");

else

 

cprintf("RTS

[OFF]\r\n");

if (DTR_ON)

 

cprintf("DTR

[ON]\r\n");

else

 

cprintf("DTR

[OFF]\r\n");

if (BREAK_ON)

 

cprintf("BREAK

[ON]\r\n");

else

 

cprintf("BREAK

[OFF]\r\n");

}

void OutputWindow(void) // Okno vvoda

{

window(1,1,80,10);

cprintf("==========Output

Window========================================

========\r\n");

gotoxy(xo,yo);

cprintf("%c",out); xo = wherex(); yo = wherey();

}

void InputWindow(void) // Okno vyvoda

{

window(1,12,80,21);

cprintf("==========Input

136

Window=================================================

========\r\n");

gotoxy(xi,yi);

cprintf("%c",in); xi = wherex(); yi = wherey();

}

void Protocol(void) // Protocol Obmena

{

ResetRTS(); // Ishodnoye sostoyaniye ViewPort();

// Peredacha if (CTS_ON == 0) // Esli CTS = 0

if (kbhit()) // Esli nazhata klavisha

{

SetRTS();

// Ustanavlivaem RTS = 1

out = getch();

// Schityvaem simvol

if (out == 27) exit(0);

// Esli ESC – vyhod

if (Transferer_Ready())

// Esli peredatchik gotov

{

 

Transferer(out);

// Peredaem

OutputWindow();

// Vyvodim simvol

}

 

while(CTS_ON == 0)

// Zhdem podtverzhdeniya priema

{

// t.e. CTS = 1

ViewPort();

//

if (TimeOut()) break;

// Esli Time Out – ne zhdem

}

//

ResetRTS();

// Posle etogo sbrasyvaem RTS,RTS = 0

}

 

 

// Priem

ViewPort();

 

if (CTS_ON == 1)

// Esli CTS = 1

if (Receiver_Ready())

// Esli priemnik gotov

{

 

in = Receiver();

// prinimaem

137

InputWindow();

// vyvodim

SetRTS();

// Podtverzhdaem priem RTS = 1

while (CTS_ON == 1)

// Zhdem RTS = 0

{

//

ViewPort();

//

if (TimeOut()) break;

// Esli Time Out – ne zhdem

}

//

ResetRTS();

// Sbrasyvaem RTS,RTS = 0

}

 

}

 

void InitInterface(void)

 

{

 

OutputWindow();

 

InputWindow();

 

}

 

void main(void)

 

{

 

textbackground(BLACK);

clrscr();

cprintf("Laboratornaya Rabota #2\r\n"); cprintf("Variant #8\r\n");

cprintf("[ESC] to exit [ANY KEY] to continue\r\n"); if (getch() == 27) exit(0);

InitPort();

InitInterface(); while (out!=27)

{

Protocol();

}

getch();

cprintf(" End of program\r\n"); getch();

}

138

Контрольные вопросы

1.Какой из двух режимов асинхронного порта RS-232 обеспечивает более высокую скорость передачи пользовательских данных:

первый режим: скорость передачи – 38,4 Кбит/с, семибитовый код данных, один стоп-бит, контроль по чётности (нечётности) отсутствует;

второй режим: скорость передачи – 38, 4 Кбит/с, восьмибитовый код данных, два стоп-бита, имеется бит контроля по чётности (нечётности).

Вычислите фактическую максимальную скорость передачи данных при использовании того и другого режима.

Решение. В первом режиме 9-битовая информационная посылка содержит стартовый бит, семь битов данных и стоп-бит. Доля полезных данных: 7/9 ≈ 0,78. Доля служебных данных: 2/9 ≈ 0,22. Максимальная скорость передачи полезных данных в первом режиме равна 38,4 × 0,78 ≈ 30 Кбит/с. Во втором режиме 12-битовая информационная посылка содержит стартовый бит, восемь битов данных, два стоп-бита, а также бит контроля по чётности (нечётности). Доля полезных данных: 8/12 ≈ 0,67. Доля служебных данных: 4/12 ≈ 0,33. Максимальная скорость передачи полезных данных во втором режиме равна 38,4 х 0,67 ≈ 25,6 Кбит/с. Таким образом, максимальная скорость передачи пользовательских данных в первом режиме более высокая, чем во втором.

2.Известно, что восстановление потерянной синхронизации приёмника с передатчиком в асинхронном интерфейсе семейства RS при отсутствии пауз между посылками гарантированно достигается в период принудительной передачи 7-разрядного нулевого кода данных. Если данные посылаются без кода синхронизации, то

вероятность обнаружения нулевого кода в случайной 9-битовой старт-стоповой посылке равна 1/27. Оценить длину цепи посылок, которая гарантирует установление синхронизации с вероятностью не менее 0,999.

Решение. Если длина цепи равна одной посылке, то вероятность Р1 гарантированного установления синхронизации равна вероятности обнаружения в этой посылке нулевого кода (1/128). Вероят-

ность Q1 неустановления синхронизации равна 1 – P1 ≈ 0,992. Эта величина убывает с возрастанием длины N цепи: Q(N) = (1 – 1/128)N.

139

В свою очередь, вероятность Р(N) установления синхронизации Р(N) = 1 – Q(N) растёт с увеличением N. Таким образом, после прохождения цепи из 1024 посылок синхронизация будет достигнута с вероятностью 0,99968. Эта оценка не учитывает, что посылки, содержащие код 1111111, также обеспечивают вхождение в синхронизацию в случае её потери.

3. В системе передачи, показанный непрерывный поток случайных данных разделён на кадры одинаковой длины, равной N бит. Каждый кадр содержит флаг F длиной М бит, в теле кадра могут содержаться ложные флаги. Оцените вероятность того, что после включения ранее выключенного приёмника первый же обнаруженный им флаг будет истинным, а не ложным. Варианты задачи:

М = 10; N = 104 бит; М = 30; N = 104 бит.

Решение. Так как поток данных имеет случайный характер, то 10-разрядный флаговый код F будет встречаться в нем в среднем каждые 1024 бит. При длине кадра, равной 104 бит, в нем будет обнаружено около 10 ложных флагов. Таким образом, вероятность составляет 1/11 ≈ 0,091.

4.Примените байтстаффинг к последовательности данных для исключения из неё копий команд управления: FA, EE, 12, 10, 10, 10, 99, 13, 13, 05, 11, 10, 88, 11, 11, CC, DD, DD, 11; DLE = 10, XON =

=11, XOFF = 13 (коды приведены в системе счисления по основа-

нию 16).

Решение. После суммирования по модулю два с кодом 21 коды 10, 11 и 13 преобразуются в коды 31, 30 и 32. Эти коды предваряются кодом 10. Результат байтстаффинга:

FA, EE, 12, 10, 31, 10, 31, 10, 31, 99, 10, 32, 10, 32, 05, 10, 30, 10, 31, 88, 10, 30, 10, 30, CC, DD, DD, 10, 30.

5.Применяя метод программного управления потоком данных, ввести команды XOFF и XON в начало и конец последовательности данных:

FA, EE, 12, 10, 10, 10, 99, 13, 13, 05, 11, 10, 88, 11, 11, CC, DD, DD, 11;

DLE = 10, XON = 11, XOFF = 13. (коды приведены в системе счисления по основанию 16)

Решение. Применим байтстаффинг к последовательности пользовательских данных.

140

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