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

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

Жанры

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

SetCommState(port,dсb);

SetCommTimeouts(port,&ct);

HeapFree(GetProcessHeap 0,0,dсb);

CloseHandle(port);

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

Первым делом, с помощью функции HeapAlloc, выделяется и заполняется нулями область памяти для DCB. Затем в поле DCBlength заносится размер структуры DCB в байтах. Зачем это нужно обсуждалось выше, при описании данного

поля. Для общего (и наглядного) заполнения DCB использована функция BuildCommDCB. Будем считать, что нас устраивает информация занесенная в DCB, но требуется игнорировать нулевые байты при приеме. Так как BuildCommDCB не выполняет требуемых действий мы вручную изменяем соответствующее поле. Далее мы заполняем информацию о таймаутах. Общие тайм-ауты операций чтения и записи не используются, конец сообщения определяется по тайм-ауту между двумя последовательными символами большему 10 миллисекунд. Теперь можно открыть порт, что делается функцией CreateFile, и выполнить его настройку вызвав функции SetCommState и SetCommTimeots. После установки параметров порта структура DCB становится не нужной, поэтому можно освободить занимаемую ей память. Структура COMMTIMEOUTS в примере размещена статически, поэтому выделять под нее память и освобождать ее не требуется. Наконец, мы закрываем порт перед завершением.

Функции HeapAlloc и HeapFree занимаются выделением и освобождением памяти из куч, которых в программе может быть несколько. Вместо этих функций можно использовать malloc (calloc) и free. Однако использование функций предоставляемых Win32 API позволяет сократить размер программы, что может быть не маловажно, если работа с портами ведется из DLL (например Вы пишете своеобразный псевдодрайвер для своего устройства). Есть и другие аргументы в пользу этой точки зрения, которую я Вам, впрочем, не навязываю.

Рассмотренные структуры и функции позволяют программировать порт на достаточно низком уровне. Их, в большинстве случаев, более чем достаточно даже для тонкой настройки порта. Однако бывают и исключения. Например, под именем СОМ1 может скрываться вовсе не привычный порт RS-232, а какая-нибудь экзотика. Или порт может не позволять задавать скорость более 9600.

Структура COMMPROP

Исчерпывающая информация о возможностях коммуникационного устройства и драйвера содержится в структуре COMMPROP:

typedef struct _COMMPROP {{

WORD wPacketLength; // packet size, in bytes

WORD wPacketVersion; // packet version

DWORD dwServiceMask; // services implemented

DWORD dwReservedl; // reserved

DWORD dwMaxTxQueue; // max Tx bufsize, in bytes

DWORD dwMaxRxQueue; // max Rx bufsize, in bytes

DWORD dwMaxBaud; // max baud rate, in bps

DWORD dwProvSubType; // specific provider type

DWORD dwProvCapabilities; // capabilities supported

DWORD dwSettableParams; // changable parameters

DWORD dwSettableBaud; // allowable baud rates

WORD wSettableData; // allowable byte sizes

WORD wSettablestopParity; // stop bits/parity allowed

DWORD dwCurrentTxQueue; // Tx buffer size, in bytes

DWORD dwCurrentRxQueue; // Rx buffer size, in bytes

DWORD dwProvSpec1; // provider-specific data

DWORD dwProvSpec2; // provider-specific data

WCHAR wcProvChar[1]; // provider-specific data

} COMMPROP;

Поля

этой структуры описывают все возможности драйвера. Вы не можете выйти за пределы этих возможностей. Вот какое значение имеют поля:

• wPacketLength

Задает размер, в байтах, структуры COMMPROP.

• wPacketVersion

Номер версии структуры.

• dwServiceMask

Битовая маска. Для коммуникационных устройств всегда SPSERIALCOMM, включая модемы.

• dwReserved1

Зарезервировано и не используется.

• dwMaxTxQueue

Максимальный размер, в байтах, внутреннего буфера передачи драйвера. Нулевое значение свидетельствует об отсутствии ограничения.

• dwMaxRxQueue

Максимальный размер, в байтах, внутреннего буфера приема драйвера. Нулевое значение свидетельствует об отсутствии ограничения.

• dwMaxBaud

Максимально допустимая скорость обмена, в битах в секунду (бпс). Возможны следующие значения данного поля:

• BAUD_075 — 75 бпс

• BAUD_110 — 110 бпс

• BAUD_134_5 — 134.5 бпс

• BAUD_150 — 150 бпс

• BAUD_300 — 300 бпс

• BAUD_600 — 600 бпс

• BAUD_1200 — 1200 бпс

• BAUD_1800 — 1800 бпс

• BAUD_2400 — 2400 бпс

• BAUD_4800 — 4800 бпс

• BAUD_7200 — 7200 бпс

• BAUD_9600 — 9600 бпс

• BAUD_14400 — 14400 бпс

• BAUD_19200 — 19200 бпс

• BAUD_38400 — 38400 бпс

• BAUD_56K — 56К бпс

• BAUD_57600 — 57600 бпс

• BAUD_115200 — 115200 бпс

• BAUD_128K — 128К бпс

• BAUD_USER — Допускается программирование скорости обмена

• dwProvSubType

Тип коммуникационного порта. Возможны следующие значения данного поля:

• PST_FAX — Факс

• PST_LAT LAT — протокол

• PST_MODEM — Модем

• PST_NETWORK_BRIDGE — Сетевой мост

• PST_PARALLELPORT — Параллельный порт

• PST_RS232 — Последовательный порт RS-232

• PST_RS422 — Порт RS-422

• PST_RS423 — Порт RS-423

• PST_RS449 — Порт RS-449

• PST_SCANNER — Сканнер

• PST_TCPIP_TELNET — Протокол TCP/IP TelnetR

• PST_UNSPECIFIED — Неизвестное устройство

• PST_Х25 — Устройство стандарта X.25

• dwProvCapabilities

Битовая маска. Определяет возможности предоставляемые устройством. Возможны следующие значения:

• PCF_16BITMODE — Поддерживается специальный 16-битный режим.

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

Кодекс Охотника. Книга XVIII

Винокуров Юрий
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVIII

Оружие победы

Грабин Василий Гаврилович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Оружие победы

Конь Рыжий

Москвитина Полина Дмитриевна
2. Сказания о людях тайги
Проза:
историческая проза
8.75
рейтинг книги
Конь Рыжий

Хёвдинг Нормандии. Эмма, королева двух королей

Улофсон Руне Пер
Проза:
историческая проза
5.00
рейтинг книги
Хёвдинг Нормандии. Эмма, королева двух королей

Офицер-разведки

Поселягин Владимир Геннадьевич
2. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Офицер-разведки

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

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

Девочка-яд

Коэн Даша
2. Молодые, горячие, влюбленные
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка-яд

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Никчёмная Наследница

Кат Зозо
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Никчёмная Наследница

Пипец Котенку!

Майерс Александр
1. РОС: Пипец Котенку!
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Пипец Котенку!

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри

Игра престолов

Мартин Джордж Р.Р.
1. Песнь Льда и Огня
Фантастика:
фэнтези
9.48
рейтинг книги
Игра престолов

Картошка есть? А если найду?

Дорничев Дмитрий
1. Моё пространственное убежище
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.50
рейтинг книги
Картошка есть? А если найду?

Черный дембель. Часть 2

Федин Андрей Анатольевич
2. Черный дембель
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Черный дембель. Часть 2