Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №8
Шрифт:

Если тайм-аут при чтении понятен, то тайм-аут при записи вызывает недоумение. В самом деле, что нам мешает передавать? Управление потоком! Внешнее устройство может использовать, например, аппаратное управление потоком. При этом пропадание питания во внешнем устройстве заставит компьютер приостановить передачу данных. Если не контролировать тайм-аут возможно точно такое же зависание компьютера, как и при операции чтения.

Общий тайм-аут зависит от количества участвующих в операции чтения/записи символов и среднего времени передачи одного символа с учетом межсимвольного интервала. Если символов много, например 1000,

то на общем времени выполнения операции начинают сказываться колебания времени затрачиваемого на один символ или времени межсимвольного интервала. Поэтому тайм-ауты в структуре COMMTIMEOUTS задаются двумя величинами. Таким образом формула для вычисления общего тайм-аута операции, например чтения, выглядит так:

NumOfChar * ReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant,

где NumOfChar это число символов запрошенных для операции чтения.

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

Теперь небольшой пример. ReadTotalTimeoutMultiplier = 2, ReadTotalTimeoutConstant = 1, ReadlntervalTimeout = 1,

считывается 250 символов. Если операция чтения завершится за 250 * 2 + 1 = 501 миллисекунду, то будет считано все сообщение. Если операция чтения не завершится за 501 миллисекунду, то она все равно будет завершена. При этом будут возвращены символы, прием которых завершился до истечения тайм-аута операции. Остальные символы могут быть получены следующей операцией чтения. Если между началами двух последовательных символов пройдет более 1 миллисекунды, то операция чтения так же будет завершена.

Надеюсь, что теперь тайм-ауты не будут вызывать у Вас затруднений. Для завершения темы тайм-аутов рассмотрим один частный случай. Если поля ReadlntervalTimeout и ReadTotalTimeoutMultiplier установлены в MAXDWORD, а ReadTotalTimeoutConstant больше нуля и меньше MAXDWORD, то выполнение операции чтения подчиняется следующим правилам:

• Если в буфере есть символы, то чтение немедленно завершается и возвращается символ из буфера;

• Если в буфере нет символов, то операция чтения будет ожидать появления любого символа, после чего она немедленно завершится;

• Если в течении времени, заданного полем ReadTotalTimeoutConstant, не будет принято ни одного символа, операция чтения завершится по тайм-ауту.

• Помните функцию BuildCommDCB? Существует еще функция BuildCommDCBAndTimeouts, которая позволяет заполнить не только структуру DCB, но и структуру COMMTIMEOUTS.

Функция BuildCommDCBAndTimeouts

Функция BuildCommDCBAndTimeouts позволяет заполнить не только структуру DCB, но и структуру COMMTIMEOUTS. Вот как выглядит ее прототип:

BOOL BuildCommDCBAndTimeouts(

LPCTSTR lpDef,

LPDCB lpDCB,

LPCOMMTIMEOUTS lpCommTimeouts

);

Как

видно, у этой функции, по сравнению с BuildCommDCB, появился третий параметр. Это указатель на структуру COMMTIMEOUTS. Конфигурационная строка при вызове этой функции должна задаваться в новом формате. Если эта строка содержит подстроку "TO=ON", то устанавливаются общие тайм-ауты для операций чтения и записи. Это значения устанавливаются на основе информации о скорости передачи и формате посылки. Если конфигурационная строка содержит подстроку "TO=OFF", то устанавливается режим работы без тайм-аутов. Если конфигурационная строка не содержит подстроки "ТО=ххх" или эта подстрока имеет неверное значение, то указатель на структуру COMMTIMEOUTS просто игнорируется. При этом функция BuilCommDCBAndTimeouts оказывается идентичной функции BuildCommDCB.

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

Функция GetCommTimeouts

Как и для заполнения структуры DCB, для COMMTIMEOUTS существует функция считывания установленных в системе значений. Это функция GetCommTimeouts:

BOOL GetCommTimeouts(

HANDLE hFile,

LPCOMMTIMEOUTS lpCommTimeouts

);

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

Функция SetCommTimeouts

Заполнив структуру COMMTIMEOUTS можно вызывать функцию установки тайм-аутов порта. Это функция называется SetCommTimeouts:

BOOL SetCommTimeouts(

HANDLE hFile,

LPCOMMTIMEOUTS lpCommTimeouts

);

Параметры этой функции тоже достаточно очевидны. Установку тайм-аутов можно производить как до установки параметров порта, так и после. Последовательность вызова функций SetCommState и SetCommTimeouts не имеет никакого значения. Главное, что бы все настройки были завершены до начала ввода/вывода информации.

Теперь приведу пример настройки порта:

#include <windows.h>

DCB * dсb;

COMMTIMEOUTS ct;

HANDLE port;

dcb=(DCB*)HeapAlloc(GetProcessHeap,HEAP_Z ERO_MEMORY,sizeof(DCB));

dcb->DCBlength=sizeof(DCB);

BuildCommDCB("baud=9600 parity=N data=8 stop=1",dсb);

dcb->fNull=TRUE;

ct.ReadIntervalTimeout=10;

ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;

ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile(COM2",GENERIC_READ|GENERIC_WRIТЕ,0,NULL,OPEN_EXISTING,0,NULL);

Поделиться:
Популярные книги

Адептус Астартес: Омнибус. Том I

Коллектив авторов
Warhammer 40000
Фантастика:
боевая фантастика
4.50
рейтинг книги
Адептус Астартес: Омнибус. Том I

Имперский Курьер. Том 2

Бо Вова
2. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 2

Никто и звать никак

Ром Полина
Фантастика:
фэнтези
7.18
рейтинг книги
Никто и звать никак

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Возвышение Меркурия. Книга 17

Кронос Александр
17. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 17

Игрушка богов. Дилогия

Лосев Владимир
Игрушка богов
Фантастика:
фэнтези
4.50
рейтинг книги
Игрушка богов. Дилогия

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Законы Рода. Том 10

Андрей Мельник
10. Граф Берестьев
Фантастика:
юмористическая фантастика
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 10

Госпожа Доктор

Каплунова Александра
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Госпожа Доктор

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

Интернет-журнал "Домашняя лаборатория", 2007 №7

Журнал «Домашняя лаборатория»
Дом и Семья:
хобби и ремесла
сделай сам
5.00
рейтинг книги
Интернет-журнал Домашняя лаборатория, 2007 №7

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II