Добавить в цитаты Настройки чтения

Страница 310 из 436



Функции 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-битный режим.

• PCF_DTRDSR — Поддерживаются сигналы DTR/DSR.

• PCF_INTTIMEOUTS — Поддерживается межсимвольный тайм-аут.

• PCF_PARITY_CHECK — Поддерживается контроль четности.

• PCF_RLSD — Поддерживается определение наличия сигнала в приемной линии.

• PCF_RTSCTS — Поддерживаются сигналы RTS/CTS.

• PCF_SETXCHAR — Поддерживаются задаваемые символы XON/XOFF.

• PCF_SPECIALCHARS — Поддерживаются спецсимволы.

• PCF_TOTALTIMEOUTS — Поддерживаются общие тайм-ауты (ожидаемое время).

• PCF_XONXOFF — Поддерживается программное (XON/XOFF) управление потоком.

• PCF_XONXOFF — Поддерживается программное (XON/XOFF) управление потоком.

∙ dwSettableParams

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

• SP_BAUD — Скорость обмена.

• SP_DATABITS — Бит в символе.

• SP_HANDSHAKING — Рукопожатие (управление потоком).

• SP_PARITY — Четность.

• SP_PARITY_CHECK — Контроль четности.

• SP_RLSD — Детектирование наличия сигнала в приемной линии.

• SP_STOPBITS — Количество стоповых бит.

∙ dwSettableBaud

Битовая маска. Определяет допустимый набор скоростей обмена. Допустимые для данного поля значения указаны в описании поля dwMaxBaud.

∙ wSettableData

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

• DATABITS_5 — 5 бит

• DATABITS_6 — 6 бит

• DATABITS_7 — 7 бит

• DATABITS_8 — 8 бит

• DATABITS_16 — 16 бит

• DATABITS_16Х — Специальный широкий канал через аппаратную последовательную линию.

∙ wSettableStop Parity

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

• STOPBITS_10 — Один стоповый бит

• STOPBITS_15 — Полтора стоповых бита

• STOPBITS_20 — Два стоповых бита

• PARITY_NONE — Без четности

• PARITY_ODD — Дополнение до нечетности

• PARITY_EVEN — Дополнение до четности

• PARITY_MARK — Бит четности всегда "1"

• PARITY_SPACE — Бит четности всегда "0"

∙ dwCurrentTxQueue

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

∙ dwCurrentRxQueue

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

∙ dwProvSped

Устройство-зависимые данные. Программа должна игнорировать содержимое данного поля, за исключением случаев, когда Вы точно знаете формат этих данных. Занесите в данное поле значение COMMPROP_INITIALIZED, если поле wPacketLength уже содержит правильное значение.

∙ dwProvSpec2

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