Структура COMMTIMEOUTS - параметры временных задержек COM-порта
Описание структуры COMMTIMEOUTS
Все примеры приведены для среды разработки Embarcadero RAD Studio 11 (C++ Builder)
Структура COMMTIMEOUTS описывает параметры временнЫх задержек COM-порта.
(Ударение ставится на последний слог (букву Ы). Описываются задержки во времени, а не то что они могут быть постоянными или врЕменными).
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; /* Maximum time between read chars. */
DWORD ReadTotalTimeoutMultiplier; /* Multiplier of characters. */
DWORD ReadTotalTimeoutConstant; /* Constant in milliseconds. */
DWORD WriteTotalTimeoutMultiplier; /* Multiplier of characters. */
DWORD WriteTotalTimeoutConstant; /* Constant in milliseconds. */
} COMMTIMEOUTS, *LPCOMMTIMEOUTS;
Описание полей структуры COMMTIMEOUTS
Максимальное время (в миллисекундах), допустимое между двумя последовательными символами, принимаемыми по линии связи. При превышении этого времени операция чтения завершается, все данные из буфера передаются в вызывающую программу.
При нулевом значении поля данный тайм-аут не используется.
При значении поля равным MAXDWORD, вместе с нулевыми значениями полей ReadTotalTimeoutConstant и ReadTotalTimeoutMultiplier, указывают на немедленный возврат из операции чтения с передачей буфера вызывающей программе, даже если передача не закончена.
Таймаут начинает отсчитываться с момента приёма первого бита символа. Точнее сказать что ReadIntervalTimeout - интервал между началами двух последовательных символов, т.е. в него входит и время передачи одного символа.
Множитель, используемый для расчёта общего периода ожидания операций чтения в миллисекундах. Для каждой операции чтения это значение умножается на запрошенное количество принимаемых символов.
Константа, используемая для вычисления общего периода ожидания операций чтения в миллисекундах.
Для каждой операции чтения это значение добавляется к произведению множителя ReadTotalTimeoutMultiplier и запрашиваемого количества принимаемых символов.
Нулевые значения полей ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant указывают на то, что общее время ожидания не используется для операций чтения.
Множитель, используемый для расчёта общего периода ожидания операций записи в миллисекундах. Для каждой операции записи это значение умножается на количество записываемых символов.
Константа, используемая для вычисления общего периода ожидания операций записи в миллисекундах.
Для каждой операции записи это значение добавляется к произведению множителя WriteTotalTimeoutMultiplier и количества записываемых символов.
Нулевые значения полей WriteTotalTimeoutMultiplier и WriteTotalTimeoutConstant указывают на то, что общее время ожидания не используется для операций записи.
Получение информации о структуре COMMTIMEOUTS
Получить информацию о структуре COMMTIMEOUTS можно вызвав функцию GetCommTimeouts(). Прототип функции находится в файле winbase.h.
WINBASEAPI BOOL WINAPI GetCommTimeouts(
_In_ HANDLE hFile,
_Out_ LPCOMMTIMEOUTS lpCommTimeouts
);
- HANDLE hFile - указатель типа void на дескриптор открытого порта.
typedef void *HANDLE; //- winnt.h
- LPCOMMTIMEOUTS lpCommTimeouts - указатель на структуру COMMTIMEOUTS.
При успешном вызове функции возвращаемое значение будет ненулевым (true), при ошибке функция возвращает 0 (false). Информацию о ошибке можно получить, вызвав функцию GetLastError().
Модификаторы вызова функции и аргументов:
- WINBASEAPI (он же DECLSPEC_IMPORT, или __declspec(dllimport)) - указывает на класс хранилища функции. Позволяет получить доступ к объектам библиотеки DLL.
- WINAPI (он же __stdcall) - соглашение о вызове функций Win32 API: аргументы передаются справа налево через стек; очистка стека ложится на вызываемую функцию; возвращаемое значение в регистре eax.
- _In_ и _Out_ - макросы, которые вызываются только при использовании SAL2.0 — языка заметок для драйверов Windows (способ описания свойств функций, параметров, возвращаемых значений, структур и полей структуры). В данном случае не используются.
Сохранение информации в структуре COMMTIMEOUTS
Сохранить информацию в структуре COMMTIMEOUTS можно вызвав функцию SetCommTimeouts(). Прототип функции находится в файле winbase.h.
WINBASEAPI BOOL WINAPI SetCommTimeouts(
_In_ HANDLE hFile,
_In_ LPCOMMTIMEOUTS lpCommTimeouts
);
Вызов функции в момент передачи может вызвать искажение передаваемых данных. Параметры и возвращаемые значения аналогичны GetCommTimeouts().