Similar presentations:
Последовательный порт. Архитектура персональных компьютеров
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.