Структура DCB - основные параметры COM-порта
Описание структуры DCB
Все примеры приведены для среды разработки Embarcadero RAD Studio 11 (C++ Builder)
Структура DCB описывает основные параметры COM-порта.
typedef struct _DCB {
DWORD DCBlength; /* sizeof(DCB) */
DWORD BaudRate; /* Baudrate at which running */
DWORD fBinary: 1; /* Binary Mode (skip EOF check) */
DWORD fParity: 1; /* Enable parity checking */
DWORD fOutxCtsFlow:1; /* CTS handshaking on output */
DWORD fOutxDsrFlow:1; /* DSR handshaking on output */
DWORD fDtrControl:2; /* DTR Flow control */
DWORD fDsrSensitivity:1; /* DSR Sensitivity */
DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */
DWORD fOutX: 1; /* Enable output X-ON/X-OFF */
DWORD fInX: 1; /* Enable input X-ON/X-OFF */
DWORD fErrorChar: 1; /* Enable Err Replacement */
DWORD fNull: 1; /* Enable Null stripping */
DWORD fRtsControl:2; /* Rts Flow control */
DWORD fAbortOnError:1; /* Abort all reads and writes on Error */
DWORD fDummy2:17; /* Reserved */
WORD wReserved; /* Not currently used */
WORD XonLim; /* Transmit X-ON threshold */
WORD XoffLim; /* Transmit X-OFF threshold */
BYTE ByteSize; /* Number of bits/byte, 4-8 */
BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */
BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */
char XonChar; /* Tx and Rx X-ON character */
char XoffChar; /* Tx and Rx X-OFF character */
char ErrorChar; /* Error replacement char */
char EofChar; /* End of Input character */
char EvtChar; /* Received Event character */
WORD wReserved1; /* Fill for now. */
} DCB, *LPDCB;
Описание полей структуры DCB
Можно посчитать, учитывая размер:
- BYTE и char - 1 байт (8 бит)
- WORD - 2 байта (16 бит)
- DWORD - 4 байта (32 бита)
- битовые поля, занимающие в сумме 4 байта (DWORD, 32 бита)
// Baud rates at which the communication device operates
#define CBR_110 110
#define CBR_300 300
#define CBR_600 600
#define CBR_1200 1200
#define CBR_2400 2400
#define CBR_4800 4800
#define CBR_9600 9600
#define CBR_14400 14400
#define CBR_19200 19200
#define CBR_38400 38400
#define CBR_56000 56000
#define CBR_57600 57600
#define CBR_115200 115200
#define CBR_128000 128000
#define CBR_256000 256000
Скорость можно задавать как символическими константами CBR_..., так и числовыми значениями.
В недвоичном режиме обмена (Win 3.1) передаваемые данные интерпретировались как текстовое сообщение, а символ, заданный полем EofChar, указывал на конец сообщения.
- RTS (Ready To Send, готов к передаче) - выход приёмника. Активный уровень (низкий) разрешает передатчику отправлять данные.
- CTS (Clear To Send, линия данных свободна для передачи) - вход передатчика. Активный уровень (низкий) сигнализирует, что приёмник обработал входные данные и готов принимать следующие.
- DSR (Data Set Ready, готов к работе) - вход. Активный уровень (низкий) сообщает о готовности внешнего устройства к обмену данными с компьютером/терминалом.
- DTR (Data Terminal Ready, терминал готов к работе) - выход. Активный уровень (низкий) сообщает о готовности компьютера/терминала к обмену данными с внешним устройством.
// DTR Control Flow Values.
#define DTR_CONTROL_DISABLE 0x00
#define DTR_CONTROL_ENABLE 0x01
#define DTR_CONTROL_HANDSHAKE 0x02
- DTR_CONTROL_DISABLE - запрещает использование линии DTR.
- DTR_CONTROL_ENABLE - разрешает использование линии DTR.
- DTR_CONTROL_HANDSHAKE - разрешает использование рукопожатия (HANDSHAKE) на линии DTR для выхода из ошибочных ситуаций. Используется модемами при восстановлении связи.
При сброшенном флаге fTXContinueOnXoff: передача данных будет прервана, если буфер приёмника заполнен на более чем XoffLim символов, и приёмник передал символ XoffChar для приостановки передачи. Передача данных будет продолжена, если приемном буфере останется меньше XonLim символов и приёмник передаст символ XonChar для возобновления работы передатчика.
// RTS Control Flow Values
#define RTS_CONTROL_DISABLE 0x00
#define RTS_CONTROL_ENABLE 0x01
#define RTS_CONTROL_HANDSHAKE 0x02
#define RTS_CONTROL_TOGGLE 0x03
- RTS_CONTROL_DISABLE - управление по линии RTS запрещено.
- RTS_CONTROL_ENABLE - управление по линии RTS разрешено.
- RTS_CONTROL_HANDSHAKE - приёмник устанавливает (лог 0) сигнал на линии RTS, когда приемный буфер заполнен менее чем на половину; и сбрасывает (лог 1), когда приемный буфер заполнен более чем на три четверти.
- RTS_CONTROL_TOGGLE - если есть данные для передачи, то сигнал на линии RTS установлен (лог 0), иначе сброшен (лог 1). [уточнить!!! сигнал RTS устанавливает приёмник, а здесь есть данные у передатчика (приёмник о них и не знает)???]
#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define MARKPARITY 3
#define SPACEPARITY 4
- NOPARITY - бит чётности отсутствует.
- ODDPARITY - проверка на нечётность. Дополняет передаваемый символ битом, чтобы количество единиц в передаваемом символе стало нечётным.
- EVENPARITY - проверка на чётность. Дополняет передаваемый символ битом, чтобы количество единиц в передаваемом символе стало чётным.
- MARKPARITY - бит чётности всегда равен 1.
- SPACEPARITY - бит чётности всегда равен 0.
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2
- ONESTOPBIT - один стоповый бит.
- ONE5STOPBITS - полтора стоповых бита.
- TWOSTOPBITS - два стоповых бита.
В недвоичном (текстовом) режиме обмена указывал на конец передаваемых данных. В Win 32/64 не используется.
Получение информации о структуре DCB
Получить информацию о структуре DCB можно вызвав функцию GetCommState. Прототип функции находится в файле winbase.h.
WINBASEAPI BOOL WINAPI GetCommState(
_In_ HANDLE hFile,
_Out_ LPDCB lpDCB
);
- HANDLE hFile - указатель типа void на дескриптор открытого порта.
- LPDCB lpDCB - указатель на структуру DCB.
При успешном вызове функции возвращаемое значение будет ненулевым (true), при ошибке функция возвращает 0 (false). Информацию о ошибке можно получить, вызвав функцию GetLastError.
Модификаторы вызова функции и аргументов:
- WINBASEAPI (он же DECLSPEC_IMPORT, или __declspec(dllimport)) - указывает на класс хранилища функции. Позволяет получить доступ к объектам библиотеки DLL.
- WINAPI (он же __stdcall) - соглашение о вызове функций Win32 API: аргументы передаются справа налево через стек; очистка стека ложится на вызываемую функцию; возвращаемое значение в регистре eax.
- _In_ и _Out_ - макросы, которые вызываются только при использовании SAL2.0 — языка заметок для драйверов Windows (способ описания свойств функций, параметров, возвращаемых значений, структур и полей структуры). В данном случае не используются.
Сохранение информации в структуре DCB
Сохранить информацию в структуре DCB можно вызвав функцию SetCommState. Прототип функции находится в файле winbase.h.
WINBASEAPI BOOL WINAPI SetCommState(
_In_ HANDLE hFile,
_In_ LPDCB lpDCB
);
Вызов функции в момент передачи может вызвать искажение передаваемых данных. Параметры и возвращаемые значения аналогичны GetCommState.