Структура 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
Бодрейт. Скорость передачи данных

Содержит числовое значение скорости передачи.

Скорость можно задавать как символическими константами CBR_..., так и числовыми значениями.

// 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
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_DISABLE - запрещает использование линии DTR.

-  DTR_CONTROL_ENABLE - разрешает использование линии DTR.

-  DTR_CONTROL_HANDSHAKE - разрешает использование рукопожатия (HANDSHAKE) на линии DTR для выхода из ошибочных ситуаций. Используется модемами при восстановлении связи.

// DTR Control Flow Values.
#define DTR_CONTROL_DISABLE    0x00
#define DTR_CONTROL_ENABLE     0x01
#define DTR_CONTROL_HANDSHAKE  0x02
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_DISABLE - управление по линии RTS запрещено.

-  RTS_CONTROL_ENABLE - управление по линии RTS разрешено.

-  RTS_CONTROL_HANDSHAKE - приёмник устанавливает (лог 0) сигнал на линии RTS, когда приемный буфер заполнен менее чем на половину; и сбрасывает (лог 1), когда приемный буфер заполнен более чем на три четверти.

-  RTS_CONTROL_TOGGLE - если есть данные для передачи, то сигнал на линии RTS установлен (лог 0), иначе сброшен (лог 1). [уточнить!!! сигнал 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
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
Выбор схемы контроля четности

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

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

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

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

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

#define NOPARITY       0
#define ODDPARITY      1
#define EVENPARITY     2
#define MARKPARITY     3
#define SPACEPARITY    4
StopBits
Количество стоповых бит

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

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

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

#define ONESTOPBIT     0
#define ONE5STOPBITS   1
#define TWOSTOPBITS    2
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.