Структура 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

DCBlength
Размер структуры DCB в байтах
Имеет фиксированный размер 28 байт.

Можно посчитать, учитывая размер:

-  BYTE и char - 1 байт (8 бит)

-  WORD - 2 байта (16 бит)

-  DWORD - 4 байта (32 бита)

-  битовые поля, занимающие в сумме 4 байта (DWORD, 32 бита)

BaudRate
Бодрейт. Скорость передачи данных
Содержит числовое значение скорости передачи.
// 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_..., так и числовыми значениями.

fBinary
Флаг двоичного режима обмена
Win 32/64 поддерживает только двоичный режим обмена. Значение поля всегда должно быть "1".

В недвоичном режиме обмена (Win 3.1) передаваемые данные интерпретировались как текстовое сообщение, а символ, заданный полем EofChar, указывал на конец сообщения.

Флаг контроля четности
Если значение поля равно "1", то выполняется проверка четности. Схема контроля четности задается полем Parity. В случае ошибки в вызывающую программу передается код "ошибка контроля четности".
fOutxCtsFlow
Флаг разрешения линии RTS/CTS - аппаратного управления потоком данных
Если флаг fOutxCtsFlow установлен: неактивный (высокий) уровень сигнала на входе CTS передатчика приостанавливает передачу данных. Это позволяет низкоскоростному приёмнику обрабатывать поступающие данные без потерь. Подтверждение готовности устройств к обмену называют "квитирование".

-  RTS (Ready To Send, готов к передаче) - выход приёмника. Активный уровень (низкий) разрешает передатчику отправлять данные.

-  CTS (Clear To Send, линия данных свободна для передачи) - вход передатчика. Активный уровень (низкий) сигнализирует, что приёмник обработал входные данные и готов принимать следующие.

fOutxDsrFlow
Флаг разрешения линии DSR - готовности внешнего устройства к обмену
Если флаг fOutxDsrFlow установлен: неактивный (высокий) уровень сигнала на входе DSR прекращает передачу данных.

-  DSR (Data Set Ready, готов к работе) - вход. Активный уровень (низкий) сообщает о готовности внешнего устройства к обмену данными с компьютером/терминалом.

-  DTR (Data Terminal Ready, терминал готов к работе) - выход. Активный уровень (низкий) сообщает о готовности компьютера/терминала к обмену данными с внешним устройством.

fDtrControl
Флаг разрешения линии DTR - готовности устройства к обмену
Устанавливает режим работы линии 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 для выхода из ошибочных ситуаций. Используется модемами при восстановлении связи.

fDsrSensitivity
Флаг сохранения принимаемых данных в зависимости от состояния линии DSR
Если флаг fDsrSensitivity установлен: при неактивном (высоком) уровне сигнала на входе DSR все принимаемые данные отбрасываются.
fTXContinueOnXoff
Флаг продолжения передачи при заполнении входного буфера
При установленном флаге fTXContinueOnXoff: передатчик продолжит отправлять данные, даже если буфер приёмника заполнен на более чем XoffLim символов, и приёмник передал символ XoffChar для приостановки передачи.

При сброшенном флаге fTXContinueOnXoff: передача данных будет прервана, если буфер приёмника заполнен на более чем XoffLim символов, и приёмник передал символ XoffChar для приостановки передачи. Передача данных будет продолжена, если приемном буфере останется меньше XonLim символов и приёмник передаст символ XonChar для возобновления работы передатчика.

fOutX
Флаг использования программного управления (XON/XOFF) потоком данных при передаче
Если флаг fOutX установлен: то передача данных прерывается при приеме передатчиком символа XoffChar, и возобновляется при приеме символа XonChar.
fInX
Флаг использования программного управления (XON/XOFF) потоком данных при приёме
Если флаг fInX установлен: то приёмник отправляет передатчику символ XoffChar, когда приёмный буфер заполнен более чем на XoffLim байтов; и отправляет символ XonChar, когда в приемном буфере меньше XonLim байтов.
fErrorChar
Флаг замены символов с ошибкой контроля четности на символ из поля ErrorChar при приёме
Если флаг fErrorChar установлен и включен флаг контроля четности fParity=1: то символ с ошибкой контроля четности заменяется на символ из поля ErrorChar.
fNull
Флаг приёма нулевого байта
Если флаг fNull установлен: то нулевые байты (0x00) отбрасываются при приёме данных.
fRtsControl
Режимы аппаратного управления потоком данных по линии RTS
// 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 устанавливает приёмник, а здесь есть данные у передатчика (приёмник о них и не знает)???]

fAbortOnError
Флаг прекращения работы при ошибке приёма/передачи
Если флаг fAbortOnError установлен: при возникновении любой ошибки при приёме/передаче через последовательный порт, все операции прекращаются. Дальнейшее продолжение работы возможно при устранении причины возникновения ошибки и вызове функции ClearCommError().
fDummy2
Не используется
wReserved
Не используется
Должно быть установлено в 0.
XonLim
Минимальное число байтов в буфере приёма для отправки символа XonChar
Задаёт нижнюю границу в приёмном буфере: приёмник отправляет символ XonChar, когда в приемном буфере становится меньше чем XonLim байтов. Используется при программном управлении потоком данных (XON/XOFF). Управляется режим XON/XOFF флагами fInX, fOutX, fTXContinueOnXoff.
XoffLim
Максимальное число байтов в буфере приёма для отправки символа XoffChar
Задаёт верхнюю границу в приёмном буфере: приёмник отправляет символ XoffChar, когда приемный буфер заполняется на больше чем XoffLim байтов. Используется при программном управлении потоком данных (XON/XOFF). Управляется режим XON/XOFF флагами fInX, fOutX, fTXContinueOnXoff.
ByteSize
Число информационных бит в передаваемом сообщении
Parity
Выбор схемы контроля четности

#define NOPARITY       0
#define ODDPARITY      1
#define EVENPARITY     2
#define MARKPARITY     3
#define SPACEPARITY    4

-  NOPARITY - бит чётности отсутствует.

-  ODDPARITY - проверка на нечётность. Дополняет передаваемый символ битом, чтобы количество единиц в передаваемом символе стало нечётным.

-  EVENPARITY - проверка на чётность. Дополняет передаваемый символ битом, чтобы количество единиц в передаваемом символе стало чётным.

-  MARKPARITY - бит чётности всегда равен 1.

-  SPACEPARITY - бит чётности всегда равен 0.

StopBits
Количество стоповых бит

#define ONESTOPBIT     0
#define ONE5STOPBITS   1
#define TWOSTOPBITS    2

-  ONESTOPBIT - один стоповый бит.

-  ONE5STOPBITS - полтора стоповых бита.

-  TWOSTOPBITS - два стоповых бита.

XonChar
Символ XonChar
Отправляется приёмником передатчику, когда в приемном буфере меньше XonLim байтов.
XoffChar
Символ XoffChar
Отправляется приёмником передатчику, когда в приемном буфере больше XoffLim байтов.
ErrorChar
Символ ErrorChar
Используется для замены символов с ошибкой контроля чётности.
EofChar
Символ EofChar
Используется для сообщения о конце передаваемых данных.

В недвоичном (текстовом) режиме обмена указывал на конец передаваемых данных. В Win 32/64 не используется.

EvtChar
Символ EvtChar
Используется для инициализации какого-либо события.
wReserved1
Не используется
Должно быть установлено в 0.



Получение информации о структуре 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.