2-РПЗ (1061363), страница 2
Текст из файла (страница 2)
DWORD fBinary:1;
DWORD fParity:1;
DWORD fOutxCtsFlow:1;
DWORD fOutxDsrFlow:1;
DWORD fDtrControl:2;
DWORD fDsrSensitivity:1;
DWORD fTXContinueOnXoff:1;
DWORD fOutX:1;
DWORD fInX:1;
DWORD fErrorChar:1;
DWORD fNull:1;
DWORD fRtsControl:2;
DWORD fAbortOnError:1;
DWORD fDummy2:17;
WORD wReserved;
WORD XonLim;
WORD XoffLim;
BYTE ByteSize;
BYTE Parity;
BYTE StopBits;
char XonChar;
char XoffChar;
char ErrorChar;
char EofChar;
char EvtChar;
WORD wReserved1;
} DCB;
Кратко рассмотрим значения ее полей:
DCBlength — Задает длину, в байтах, структуры DCB. Используется для контроля корректности структуры при передаче ее адреса в функции настройки порта
BaudRate — Скорость передачи данных. Возможно указание следующих констант: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000. Как видно, эти константы соответствуют всем стандартным скоростям обмена. На самом деле, это поле содержит числовое значение скорости передачи, а константы просто являются символическими именами.
fBinary — Включает двоичный режим обмена. Win32 не поддерживает недвоичный режим, поэтому данное поле всегда должно быть равно 1, или логической константе TRUE (что предпочтительней).
fParity — Включает режим контроля четности. Если это поле равно TRUE, то выполняется проверка четности, при ошибке, в вызывающую программу, выдается соответствующий код завершения.
fOutxCtsFlow — Включает режим слежения за сигналом CTS. Если это поле равно TRUE и сигнал CTS сброшен, передача данных приостанавливается до установки сигнала CTS. Это позволяет подключенному к компьютеру прибору приостановить поток передаваемой в него информации, если он не успевает ее обрабатывать.
fOutxDsrFlow — Включает режим слежения за сигналом DSR. Если это поле равно TRUE и сигнал DSR сброшен, передача данных прекращается до установки сигнала DSR
fDtrControl — Задает режим управления обменом для сигнала DTR. Это поле может принимать следующие значения:
| DTR_CONTROL_DISABLE | Запрещает использование линии DTR |
| DTR_CONTROL_ENABLE | Разрешает использование линии DTR |
| DTR_CONTROL_HANDSHAKE | Разрешает использование рукопожатия для выхода из ошибочных ситуаций. Этот режим используется, в частности, модемами при восстановленни в ситуации потери связи |
fDsrSensitivity — Задает чувствительсть коммуникационного драйвера к состоянию линии DSR. Если это поле равно TRUE, то все принимаемые данные игнорируются драйвером (коммуникационный драйвер расположен в операционной системе), за исключением тех, которые принимаются при установленом сигнале DSR.
fTXContinueOnXoff — Задает, прекращается ли передача при переполнении приемного буфера и передаче драйвером символа XoffChar. Если это поле равно TRUE, то передача продолжается, несмотря на то, что приемный буфер содержит более XoffLim символов и близок к переполнению, а драйвер передал символ XoffChar для приостановления потрока принимаемых данных. Если поле равно FALSE, то передача не будет продолжена до тех пор, пока в приемном буфере не останется меньше XonLim символов и драйвер не передаст символ XonChar для возобновления потока принимаемых данных. Таким образом это поле вводит некую зависимость между управлением входным и выходным потоками информации.
fOutX — Задает использование XON/XOFF управления потоком при передаче. Если это поле равно TRUE, то передача останавливается при приеме символа XoffChar, и возобновляется при приеме символа XonChar.
fInX — Задает использование XON/XOFF управления потоком при приеме. Если это поле равно TRUE, то драйвер передает символ XoffChar, когда в приемном буфере находится более XoffLim, и XonChar, когда в приемном буфере остается менее XonLim символов.
fErrorChar — Указывает на необходимость замены символов с ошибкой четности на символ задаваемый полем ErrorChar. Если это поле равно TRUE, и поле fParity равно TRUE, то выполняется замена.
fNull — Определяет действие выполняемое при приеме нулевого байта. Если это поле TRUE, то нулевые байты отбрасываются при передаче.
fRtsControl — задает режим управления потоком для сигнала RTS. Если это поле равно 0, то по умолчанию подразумевается RTS_CONTROL_HANDSHAKE. Поле может принимать одно из следующих значений:
| RTS_CONTROL_DISABLE | Запрещает использование линии RTS |
| RTS_CONTROL_ENABLE | Разрешает использование линии RTS |
| RTS_CONTROL_HANDSHAKE | Разрешает использование RTS рукопожатия. Драйвер устанавливает сигнал RTS когда приемный буфер заполнен менее, чем на половину, и сбрасывает, когда буфер заполняется более чем на три четверти. |
| RTS_CONTROL_TOGGLE | Задает, что сигнал RTS установлен, когда есть данные для передачи. Когда все символы из передающего буфера переданы, сигнал сбрасывается. |
fAbortOnError — Задает игнорирование всех операций чтения/записи при возникновении ошибки. Если это поле равно TRUE, драйвер прекращает все операции чтения/записи для порта при возникновении ошибки. Продолжать работать с портом можно будет только после устранения причины ошибки и вызова функции ClearCommError.
fDummy2 — Зарезервировано и не используется.
wReserved — Не используется, должно быть установлено в 0.
XonLim — Задает минимальное число символов в приемном буфере перед посылкой символа XON.
XoffLim — Определяет максимальное количество байт в приемном буфере перед посылкой символа XOFF. Максимально допустимое количество байт в буфере вычисляется вычитанием данного значения из размера применого буфера в байтах.
ByteSize — Определяет число информационных бит в передаваемых и принимаемых байтах.
Parity — Определяет выбор схемы контроля четности. Данное поле должно содержать одно из следующих значений:
| EVENPARITY | Дополнение до четности |
| MARKPARITY | Бит четности всегда 1 |
| NOPARITY | Бит четности отсутствует |
| ODDPARITY | Дополнение до нечетности |
| SPACEPARITY | Бит четности всегда 0 |
StopBits — Задает количество стоповых бит. Поле может принимать следующие значения:
| ONESTOPBIT | Один стоповый бит |
| ONE5STOPBIT | Полтора стоповых бита |
| TWOSTOPBIT | Два стоповых бита |
XonChar — Задает символ XON используемый как для приема, так и для передачи.
XoffChar — Задает символ XOFF используемый как для приема, так и для передачи.
ErrorChar — Задает символ, использующийся для замены символов с ошибочной четностью.
EofChar — Задает символ, использующийся для сигнализации о конце данных.
EvtChar — Задает символ, использующийся для сигнализации о событии.
wReserved1 — Зарезервировано и не используется.
2.1Структура COMMTIMEOUTS и функции для работы с ней.
Функция SetCommTimeouts позволяет настроить COM-порт на основе данных, содержащихся в структуре COMMTIMEOUTS. Прототип этой функции выглядит так:
BOOL SetCommDCB(HANDLE hCom, LPCOMMTIMEOUTS lpCOMMTIMEOUTS);
Как видно, функция очень проста и имеет всего два параметра:
hCom — описатель последовательного порта.
lpCOMMTIMEOUTS — указатель на структуру COMMTIMEOUTS.
Функция GetCommTimeouts позволяет заполнить структуру COMMTIMEOUTS данными, соответствующими текущим параметрам COM-порта. Прототип этой функции выглядит так:
BOOL GetCommTimeouts (HANDLE hCom, LPCOMMTIMEOUTS lpCOMMTIMEOUTS);
Как видно, функция очень проста и имеет всего два параметра:
hCom — описатель последовательного порта.
lpCOMMTIMEOUTS — указатель на структуру COMMTIMEOUTS.
Структура содержит временные параметры, используемые при операциях ввода/вывода.
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS;
Кратко рассмотрим значения ее полей:
ReadIntervalTimeout — Максимальное время, в миллисекундах, допустимое между двумя последовательными символами считываемыми с коммуникационной линии. Во время операции чтения временной период начинает отсчитываться с момента приема первого символа. Если интервал между двумя последовательными символами превысит заданое значение, операция чтения завершается и все данные, накопленые в буфере, передаются в программу. Нулевое значение данного поля означает, что данный тайм-аут не используется. Значение MAXDWORD, вместе с нулевыми значениями полей ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier, означает немедленный возврат из операции чтения с передачей уже принятого символа, даже если ни одного символа не было получено из линии.
ReadTotalTimeoutMultiplier — Задает множитель, в миллисекундах, используемый для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение умножается на количество запрошенных для чтения символов.
ReadTotalTimeoutConstant — Задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции чтения. Для каждой операции чтения данное значение прибавляется к результату умножения ReadTotalTimeoutMultiplier на количество запрошеных для чтения символов. Нулевое значение полей ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant означает, что общий тайм-аут для операции чтения не используется.
WriteTotalTimeoutMultiplier — Задает множитель, в миллисекундах, используемый для вычисления общего тайм-аута операции записи. Для каждой операции записи данное значение умножается на количество записываемых символов.
WriteTotalTimeoutConstant — Задает константу, в миллисекундах, используемую для вычисления общего тайм-аута операции записи. Для каждой операции записи данное значение прибавляется к результату умножения WriteTotalTimeoutMultiplier на количество записываемых символов. Нулевое значение полей WriteTotalTimeoutMultiplier и WriteTotalTimeoutConstant означает, что общий тайм-аут для операции записи не используется.
2.2Структура COMSTAT и функции для работы с ней.
Функция ClearCommError не только сбрасывает признак ошибки для соответствующего порта, но и возвращает более подробную информацию об ошибке. Кроме того, возможно получение информации о текущем состоянии порта. Прототип этой функции выглядит так:
BOOL ClearCommError(
HANDLE hFile,
LPDWORD lpErrors,
LPCOMSTAT lpStat
);
Вот что означают параметры:
hFile — Описатель открытого файла коммуникационного порта.
lpErrors — Адрес переменной, в которую заносится информация об ошибке. В этой переменной могут быть установлен один или несколько из следующих бит:
| CE_BREAK | Обнаружено состояние разрыва связи |
| CE_DNS | Только для Windows95. Параллельное устройство не выбрано. |
| CE_FRAME | Ошибка обрамления. |
| CE_IOE | Ошибка ввода-вывода при работе с портом |
| CE_MODE | Запрошенный режим не поддерживается, или неверный описатель hFile. Если данный бит установлен, то значение остальных бит не имеет значение. |
| CE_OOP | Только для Windows95. Для параллельного порта установлен сигнал "нет бумаги". |
| CE_OVERRUN | Ошибка перебега (переполнение аппаратного буфера), следующий символ потерян. |
| CE_PTO | Только для Windows95. Тайм-аут на параллельном порту. |
| CE_RXOVER | Переполнение приемного буфера или принят символ после символа конца файла (EOF) |
| CE_RXPARITY | Ошибка четности |
| CE_TXFULL | Переполнение буфера передачи |
lpStat — Адрес структуры COMMSTAT. Должен быть указан, или адрес выделенного блока памяти, или NULL, если не требуется получать информацию о состоянии.
Структура содержит данные о текущем состоянии порта.
typedef struct _COMSTAT {
DWORD fCtsHold:1;
DWORD fDsrHold:1;















