Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[3]

BuildCommDCB("baud=9600 parity=N data=8 stop=1",dcb);

dcb->fNull=TRUE;

ct.ReadIntervalTimeout=10;

ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0; ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile("COM2",GENERIC READGENERIC WRITE,0,NULL,OPEN EXISTING,0,NULL

SetCommState(port,dcb); SetCommTimeouts(port,&ct); HeapFree(GetProcessHeap(),0,dcb);

CloseHandle(port);

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

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

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

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

Структура COMMPROP

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

COMMPROP:

typedef struct COMMPROP {{

wPacketLength;

packet size, in bytes

wPacketVersion;

packet version

dwServiceMask;

services implemented

dwReserved1;

reserved

dwMaxTxQueue;

max Tx bufsize, in bytes

dwMaxRxQueue;

max Rx bufsize, in bytes

dwMaxBaud;

max baud rate, in bps

dwProvSubType;

specific provider type

dwProvCapabilities;

capabilities supported

dwSettableParams;

changable parameters

dwSettableBaud;

allowable baud rates

wSettableData;

allowable byte sizes

wSettableStopParity;

stop bits/parity allowed

dwCurrentTxQueue;

Tx buffer size, in bytes

dwCurrentRxQueue;

Rx buffer size, in bytes

dwProvSpec1;

provider-specific data

dwProvSpec2;

provider-specific data

wcProvChar[1];

provider-specific data

} COMMPROP;

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


wPacketLength

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

wPacketVersion

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

dwServiceMask

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

dwReservedl

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

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

dwMaxRxQueue

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

dwMaxBaud

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

BAUD075

75 бпс.

BAUD110

110 бпс.

BAUD 134 5

134.5 бпс.

BAUD150

150 бпс.

BAUD300

300 бпс.

BAUD600

600 бпс.

BAUD1200

1200 бпс.

BAUD1800

1800 бпс.

BAUD 2400

2400 бпс.

BAUD 4800

4800 бпс.

BAUD 7200

7200 бпс.

BAUD 9600

9600 бпс.

BAUD 14400

14400 бпс.

BAUD 19200

19200 бпс.

BAUD 38400

38400 бпс.

BAUD56K

56K бпс.

BAUD 57600

57600 бпс.

BAUD 115200

115200 бпс.

BAUD 128K

128K бпс.

BAUDUSER

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

rovSubType

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

LAT протокол

PSTMODEM

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

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

Устройство стандарта X.25


dwProvCapabilities

Битовая маска. Определяет возможности

•PCF 16BITMODE

•PCF DTRDSR

•PCF INTTIMEOUTS

•PCF PARITY CHECK

•PCF RLSD

PCF RTSCTS

PCF SETXCHAR

PCF SPECIALCHARS

PCF TOTALTIMEOUTS

PCF XONXOFF

PCF XONXOFF

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

Поддерживается специальный 16-битный режим. Поддерживаются сигналы DTR/DSR. Поддерживается межсимвольный тайм-аут. Поддерживается контроль четности.

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

Поддерживаются сигналы RTS/CTS. Поддерживаются задаваемые символы XON/XOFF. Поддерживаются спецсимволы.

Поддерживаются общие тайм-ауты (ожидаемое время). Поддерживается программное (XON/XOFF) управление потоком.

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

dwSettableParams

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

•SP BAUDСкорость обмена.

•SP DATABITSБит в символе.

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

•SPPARITYЧетность.

•SP PARITY CHECKКонтроль четности.

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

•SP STOPBITSКоличество стоповых бит.

dwSettableBaud

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

wSettableData

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

DATABITS 5 DATABITS 6 DATABITS 7 DATABITS 8 DATABITS 16

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

wSettableStopParity

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

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

•STOPBITS15Полтора стоповыx бита

•STOPBITS 20Два стоповых бита

•PARITY NONEБез четности

•PARITY ODDДоплнение до нечетности

•PARITY EVENДополнение до четности

•PARITY MARKБит четности всегда "1"

•PARITY SPACEБит четности всегда "0"

dwCurrentTxQueue

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

dwCurrentRxQueue

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



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7]