Читать «Работа с COM и LPT в Win32.» онлайн - страница 11

Олег Титов

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

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

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

typedef struct _COMMPROP {

 WORD  wPacketLength;       // packet size, in bytes

 WORD  wPacketVersion;      // packet version

 DWORD dwServiceMask;       // services implemented

 DWORD dwReserved1;         // 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

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

dwReserved1

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

dwMaxTxQueue

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