Сафоненко Практикум по интерфейсам последователной передачи 2012
.pdfг) результаты моделирования; е) основные выводы о проделанной работе.
Варианты заданий
|
|
|
|
|
Таблица 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