Модемы и факс-модемы. Программирование для MS-DOS и Windows

       

Функция GetCommError


Функция GetCommError позволяет определить текущее состояние COM-порта и причину ошибки при предыдущем вызове коммуникационной функции.

Когда случается ошибка при передаче или приеме данных, Windows блокирует COM-порт до тех пор, пока не будет вызвана функция GetCommError.

int GetCommError(int idComDev, COMSTAT FAR* lpStat);

Параметр idComDev должен содержать идентификатор порта, который будет проверяться.

Через параметр lpStat передается дальний указатель на структуру типа COMSTAT. В поля этой структуры будет записано состояние COM-порта. В случае если вы вызовете GetCommError с параметром lpStat, равным NULL, функция вернет только значение ошибки.

Структура COMSTAT определена в файле WINDOWS.H следующим образом:

#if (defined(STRICT) (WINVER >= 0x030a))

// Основное определение структуры COMSTAT

     

typedef struct tagCOMSTAT

     

{

            

BYTE status;

            

UINT cbInQue;

            

UINT cbOutQue;



     

} COMSTAT;

     

// Определение вспомогательных констант

     

#define CSTF_CTSHOLD    0x01

     

#define CSTF_DSRHOLD    0x02

     

#define CSTF_RLSDHOLD   0x04

     

#define CSTF_XOFFHOLD   0x08

     

#define CSTF_XOFFSENT   0x10

     

#define CSTF_EOF        0x20

     

#define CSTF_TXIM       0x40

#else   /* (STRICT WINVER >= 0x030a) */

// Альтернативное определение структуры COMSTAT

     

typedef struct tagCOMSTAT

     

{

            

BYTE fCtsHold  :1;

            

BYTE fDsrHold  :1;

            

BYTE fRlsdHold :1;

            

BYTE fXoffHold :1;

            

BYTE fXoffSent :1;

            

BYTE fEof      :1;

            

BYTE fTxim     :1;

            

UINT cbInQue;

            

UINT cbOutQue;

     

} COMSTAT;

#endif  /* !(STRICT WINVER >= 0x030a */

Из приведенного выше листинга видно, что структура COMSTAT определяется по-разному в зависимости от следующего условия:

#if(defined(STRICT) (WINVER >= 0x030a))

     

// Основное определение структуры COMSTAT

     

// ....

#else   /* (STRICT WINVER >= 0x030a) */

     

// Альтернативное определение структуры COMSTAT


      // ....

#endif

Если вы создаете загрузочный модуль для операционной системы Windows 3.1 или устанавливаете жесткий режим контроля синтаксиса программы, определив константу STRICT, используется основное определение структуры COMSTAT. Опишем поля структуры COMSTAT при использовании основного определения:

Поле

Описание

status

Определяет состояние передачи данных. Оно может содержать один или несколько флагов:

CSTF_CTSHOLD       Передача данных приостановлена в ожидании сигнала CTS

CSTF_DSRHOLD      Передача данных приостановлена в ожидании сигнала DSR

CSTF_RLSDHOLD    Передача данных приостановлена в ожидании сигнала RLSD

CSTF_XOFFHOLD Передача данных приостановлена после приема символа XOFF

CSTF_XOFFSENT     Передача данных приостановлена при передаче символа XOFF. Передача приостанавливается, когда символ XOFF передан. CSTF_XOFFSENT используется системами, которые принимают следующий символ XON вне зависимости от настоящего принятого символа

CSTF_EOF     Получен символ конца файла EOF

CSTF_TXIM  Произошла задержка при передаче символа

cbInQue

Количество символов, находящихся во входной очереди

cbOutQue

Количество символов в выходной очереди

Функция GetCommError возвращает значение, являющееся комбинацией флагов. Флаги определяют ошибки, возникшие при последнем вызове коммуникационной функции.

Возвращаемое значение может быть комбинацией из следующих флагов:

Флаг

Описание

CE_BREAK

Обнаружено состояние разрыва связи (BREAK)

CE_CTSTO

Тайм-аут CTS. Во время передачи символа сигнал CTS отсутствовал дольше промежутка времени, определенного полем fCtsHold структуры COMSTAT

CE_DNS

Параллельный порт не был выбран

CE_DSRTO

Тайм-аут DSR. Во время передачи символа сигнал DSR отсутствовал промежуток времени, определенный полем fDsrHold структуры COMSTAT

CE_FRAME

Обнаружена ошибка формата кадра (framing error)

CE_IOE

Во время попытки взаимодействия с параллельным портом произошла ошибка ввода/вывода

CE_MODE

Запрашиваемый режим не поддерживается или идентификатор COM-порта недействителен. Если установлен этот флаг, другие флаги следует игнорировать

CE_OOP

Параллельный адаптер передал компьютеру сигнал "out of paper" - конец бумаги

CE_OVERRUN

Символ не был прочитан из регистров COM-порта до прихода следующего символа. В результате этот символ был потерян

CE_PTO

Истекло время (тайм-аут) при выполнении попытки взаимодействия с параллельным устройством

CE_RLSDTO

Тайм-аут RLSD. Во время передачи символа сигнал RLSD отсутствовал промежуток времени, определенный полем fRlsdHold структуры COMSTAT

CE_RXOVER

Очередь приемника переполнена. Либо очередь приемника переполнена, либо символ был получен после получения символа конца файла

CE_RXPARITY

Обнаружена ошибка четности

CE_TXFULL

Очередь передатчика полностью заполнена, но функция пытается записать новые данные в эту очередь


Содержание раздела