Функция 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 |
Количество символов в выходной очереди |
Возвращаемое значение может быть комбинацией из следующих флагов:
Флаг |
Описание |
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 |
Очередь передатчика полностью заполнена, но функция пытается записать новые данные в эту очередь |