Последовательный порт
Цель работы
Параллельный порт
LPT-порт
Последовательный порт
COM-порт (RS-232)
COM-порт (RS-232)
COM-порт (RS-232)
Программная реализация
Инициализация порта
Инициализация порта
Инициализация порта
Передача и прием данных
Передача данных
Прием данных
Результаты работы программы
Список источников
844.02K
Category: informaticsinformatics

Последовательный порт. Архитектура персональных компьютеров

1. Последовательный порт

Архитектура персональных компьютеров
Лабораторная работа №7
Последовательный порт
Подготовил:
В. Я. Богдан
450502

2. Цель работы

• Получить навыки программирования и изучить
возможности использования
последовательного интерфейса RS-232.
• Продолжительность работы — 4 часа.
Задание к лабораторной работе
Разработать программный модуль реализации
процедуры передачи (приема) информации через
последовательный интерфейс.

3.

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

4. Параллельный порт

Параллельная передача — байт информации (8
бит) передается по 8 отдельным линиям
(проводам).

5. LPT-порт

LPT (Line Print Terminal) — использовался (до появления USB)
для подключения принтера, сканера и других внешних
устройств.
В базовом варианте данные передаются в одном направлении,
однако полностью однонаправленным его назвать нельзя,
поскольку 5 обратных линий используются для контроля над
состоянием устройства.
Скорость передачи данных варьируется и лежит в пределах
от 120-200 КБ/с до 2 МБ/с.
Рассматривается как устаревший и не рекомендуется к
использованию

6. Последовательный порт

Последовательная передача — выполняется
побитно в двух направлениях и с одинаковой
частотой.
Некоторые интерфейсы (Ethernet, FireWire, USB)
используют последовательный способ обмена
информацией, название «последовательный
порт» закрепилось за портом стандарта RS-232.

7. COM-порт (RS-232)

COM-порт (communications port) — название
интерфейса стандарта RS-232.
Ранее использовался для модема или мыши. Ныне —
для соединения с ИБП, связи с аппаратными средствами
разработки и подключения некоторых других устройств.
Достоинством является крайняя простота оборудования.
Недостатком — низкая скорость, крупные размеры
разъемов.

8. COM-порт (RS-232)

Максимальная скорость передачи по
последовательному порту — 115 200 бит/с.
Передача данных может осуществляться
в синхронном и асинхронном режимах.
1
CD
<--
Наличие несущей (Carrier Detect)
2
RXD
<-- Прием данных (Receive Data)
3
TXD
--> Передача данных (Transmit Data)
4
DTR
--> Готовность приемника данных (Data Terminal Ready)
5
GND
---
6
DSR
<-- Готовность источника данных (Data Set Ready)
7
RTS
-->
8
CTS
<-- Готовность передачи (Clear to Send)
9
RI
Схемная земля (System Ground)
Запрос на передачу (Request to Send)
<-- Сигнал вызова (Ring Indicator)

9. COM-порт (RS-232)

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

10. Программная реализация

Программное взаимодействие с использованием
различных механизмов:
1. Использование функций BIOS
2. Использование аппаратных портов
3. С помощью интерфейса Win32 API
Алгоритм передачи в общем случае состоит
из следующих фаз:
•. инициализация порта;
•. передача данных;
•. прием данных;
•. анализ состояния порта.

11. Инициализация порта

С последовательными и параллельными портами в Win32
работают как с файлами.
Для открытия порта используется функция CreateFile:
m_Handle = CreateFile("com", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
Для каждого порта необходимо определить структуры DCB и
COMMTIMEOUTS, которые определяют параметры, а также
OVERLAPPED для работы в асинхронном режиме и содержит
дескриптор события (HANDLE hObject).
Закрытие порта выполняется путем освобождения
соответствующего описателя:
BOOL CloseHandle(
HANDLE hObject
);

12. Инициализация порта

После открытия необходимо произвести конфигурацию порта, для
последовательного порта используется структура DCB:
typedef struct _DCB {
DWORD DCBlength;
// sizeof(DCB)
DWORD BaudRate;
// current baud rate
DWORD fBinary:1;
// binary mode, no EOF check
DWORD fParity:1;
// enable parity checking
DWORD fOutxCtsFlow:1;
// CTS output flow control
DWORD fOutxDsrFlow:1;
// DSR output flow control
DWORD fDtrControl:2;
// DTR flow control type
DWORD fDsrSensitivity:1;
// DSR sensitivity
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX:1;
// XON/XOFF out flow control
DWORD fInX:1;
// XON/XOFF in flow control
DWORD fErrorChar:1;
// enable error replacement
DWORD fNull:1;
// enable null stripping
DWORD fRtsControl:2;
// RTS flow control
DWORD fAbortOnError:1;
// abort reads/writes on error
DWORD fDummy2:17; // reserved
WORD wReserved;
// not currently used
WORD XonLim;
// transmit XON threshold
WORD XoffLim;
// transmit XOFF threshold
BYTE ByteSize;
// number of bits/byte, 4-8
BYTE Parity;
// 0-4=no,odd,even,mark,space
BYTE StopBits;
// 0,1,2 = 1, 1.5, 2
char XonChar;
// Tx and Rx XON character
char XoffChar;
// Tx and Rx XOFF character
char ErrorChar;
// error replacement character
char EofChar;
// end of input character
char EvtChar;
// received event character
WORD wReserved1;
// reserved; do not use
} DCB;

13. Инициализация порта

Необходимо также определить временныы е параметры, которые
описываются структурой COMMTIMEOUTS:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
//Maximum time between read chars
DWORD ReadTotalTimeoutMultiplier; // Multiplier of characters
DWORD ReadTotalTimeoutConstant;
// Constant in milliseconds
DWORD WriteTotalTimeoutMultiplier; // Multiplier of characters
DWORD WriteTotalTimeoutConstant;
// Constant in milliseconds
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
Чтобы операция ReadFile немедленно возвращала управление со
всеми полученными данными (асинхронный режим) следует
задавать следующие значения:
CommTimeOuts.ReadIntervalTimeout = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;

14. Передача и прием данных

Передача данных осуществляется записью данных в файл устройства:
BOOL WriteFile(
HANDLE hFile,
// дескриптор файла
LPCVOID lpBuffer,
// буфер данных
DWORD nNumberOfBytesToWrite, // число байтов для записи
LPDWORD lpNumberOfBytesWritten,
// число записанных байтов
LPOVERLAPPED lpOverlapped
// асинхронный буфер
);
Прием данных аналогично осуществляется путем чтения
из соответствующего файла:
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
//
//
//
//
//
дескриптор файла
буфер данных
число байтов для чтения
число прочитанных байтов
асинхронный буфер
Управление состоянием порта в случае использования данной функциональности состоит
в установке поля fRtsControl структуры DCB в значение RTS_CONTROL_TOGGLE. Это
приводит к тому, что бит RTS будет автоматически устанавливаться в единицу при наличии
в выходном буфере каких-либо данных.

15. Передача данных

overCom_1.hEvent = CreateEvent(NULL, true, true, NULL);
//создать событие
//записать байты в порт
WriteFile(hCom_1, buf, strlen(buf), &temp, &overCom_1);
signal = WaitForSingleObject(overCom_1.hEvent, INFINITE);
//приостановить поток,
пока не завершится
//если операция завершилась успешно, установить соответствующий флажок
if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(hCom_1, &overCom_1, &temp, true)))
{
CloseHandle(overCom_1.hEvent);
return true;
}
CloseHandle(overCom_1.hEvent);
return false;

16. Прием данных

//главная функция потока, реализует приём байтов из COM-порта
{
COMSTAT comstat;
//структура текущего состояния порта,
DWORD btr, temp, mask, signal;
//переменная temp используется в качестве заглушки
overlapped.hEvent = CreateEvent(NULL, true, true, NULL); //создать сигнальный объект-событие
SetCommMask(COMport, EV_RXCHAR); //установить маску на срабатывание по событию приёма
while(условие) //пока поток не будет прерван, выполняем цикл
{
WaitCommEvent(COMport, &mask, &overlapped); //ожидать события приёма байта signal =
WaitForSingleObject(overlapped.hEvent, INFINITE); //приостановить поток до прихода байта
if(signal == WAIT_OBJECT_0)
//если событие прихода байта произошло
{
if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась
//перекрываемая операция WaitCommEvent
if((mask & EV_RXCHAR)!=0)
//если произошло именно событие прихода байта
{
ClearCommError(COMport, &temp, &comstat); //нужно заполнить структуру COMSTAT
btr = comstat.cbInQue;
//и получить из неё количество принятых байтов
if(btr)
//если действительно есть байты для чтения
{
ReadFile(COMport, bufrd, btr, &temp, &overlapped);//прочитать байты из порта в буфер программы
}
}
}
}
CloseHandle(overlapped.hEvent);
//перед выходом из потока закрыть объект-событие
}

17. Результаты работы программы

18. Список источников

1.
2.
3.
4.
5.
Несвежский В. Програмирование аппаратных средств в Windows —
c. 568 (557)
Авдеев В. А. Периферийные устройства: интерфейсы,
схемотехника, программирование — с. 276
Глецевич И. И. Вычислительные комплексы, системы и сети: лаб.
практикум для студ. спец. 1-40 02 01 «Вычислительные машины,
системы и сети» — с. 28
Викиучебник: COM-порт в Windows (программирование)
Работа с COM-портом с помощью потоков
Важно
Для проверки работы программы необходимо
использовать средства эмуляции COM-портов.
Например, com0com или Virtual Serial Port Driver.
English     Русский Rules