Структура 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
Имеет фиксированный размер 28 байт.
Можно посчитать, учитывая размер:
- BYTE и char - по 1 байту (8 бит)
- WORD - по 2 байта (16 бит)
- DWORD - по 4 байта (32 бита)
- битовые поля, занимающие в сумме 4 байта (DWORD, 32 бита)
Содержит числовое значение скорости передачи.
Скорость можно задавать как символическими константами 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
Win 32/64 поддерживает только двоичный режим обмена. Значение поля всегда должно быть "1".
В недвоичном режиме обмена (Win 3.1) передаваемые данные интерпретировались как текстовое сообщение, а символ, заданный полем EofChar, указывал на конец сообщения.
Если значение поля равно "1", то выполняется проверка четности. Схема контроля четности задается полем Parity. В случае ошибки в вызывающую программу передается код "ошибка контроля четности".
Если флаг fOutxCtsFlow установлен: неактивный (высокий) уровень сигнала на входе CTS передатчика приостанавливает передачу данных. Это позволяет низкоскоростному приёмнику обрабатывать поступающие данные без потерь. Подтверждение готовности устройств к обмену называют "квитирование".
- RTS (Ready To Send, готов к передаче) - выход приёмника. Активный уровень (низкий) разрешает передатчику отправлять данные.
- CTS (Clear To Send, линия данных свободна для передачи) - вход передатчика. Активный уровень (низкий) сигнализирует, что приёмник обработал входные данные и готов принимать следующие.
Если флаг fOutxDsrFlow установлен: неактивный (высокий) уровень сигнала на входе DSR прекращает передачу данных.
- DSR (Data Set Ready, готов к работе) - вход. Активный уровень (низкий) сообщает о готовности внешнего устройства к обмену данными с компьютером/терминалом.
- DTR (Data Terminal Ready, терминал готов к работе) - выход. Активный уровень (низкий) сообщает о готовности компьютера/терминала к обмену данными с внешним устройством.
Устанавливает режим работы линии 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 все принимаемые данные отбрасываются.
При установленном флаге fTXContinueOnXoff: передатчик продолжит отправлять данные, даже если буфер приёмника заполнен на более чем XoffLim символов, и приёмник передал символ XoffChar для приостановки передачи.
При сброшенном флаге fTXContinueOnXoff: передача данных будет прервана, если буфер приёмника заполнен на более чем XoffLim символов, и приёмник передал символ XoffChar для приостановки передачи. Передача данных будет продолжена, если приемном буфере останется меньше XonLim символов и приёмник передаст символ XonChar для возобновления работы передатчика.
Если флаг fOutX установлен: то передача данных прерывается при приеме передатчиком символа XoffChar, и возобновляется при приеме символа XonChar.
Если флаг fInX установлен: то приёмник отправляет передатчику символ XoffChar, когда приёмный буфер заполнен более чем на XoffLim байтов; и отправляет символ XonChar, когда в приемном буфере меньше XonLim байтов.
Если флаг fErrorChar установлен и включен флаг контроля четности fParity=1: то символ с ошибкой контроля четности заменяется на символ из поля ErrorChar.
Если флаг fNull установлен: то нулевые байты (0x00) отбрасываются при приёме данных.
- 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 установлен: при возникновении любой ошибки при приёме/передаче через последовательный порт, все операции прекращаются. Дальнейшее продолжение работы возможно при устранении причины возникновения ошибки и вызове функции ClearCommError().
Должно быть установлено в 0.
Задаёт нижнюю границу в приёмном буфере: приёмник отправляет символ XonChar, когда в приемном буфере становится меньше чем XonLim байтов. Используется при программном управлении потоком данных (XON/XOFF). Управляется режим XON/XOFF флагами fInX, fOutX, fTXContinueOnXoff.
Задаёт верхнюю границу в приёмном буфере: приёмник отправляет символ XoffChar, когда приемный буфер заполняется на больше чем XoffLim байтов. Используется при программном управлении потоком данных (XON/XOFF). Управляется режим XON/XOFF флагами fInX, fOutX, fTXContinueOnXoff.
- NOPARITY - бит чётности отсутствует.
- ODDPARITY - проверка на нечётность. Дополняет передаваемый символ битом, чтобы количество единиц в передаваемом символе стало нечётным.
- EVENPARITY - проверка на чётность. Дополняет передаваемый символ битом, чтобы количество единиц в передаваемом символе стало чётным.
- MARKPARITY - бит чётности всегда равен 1.
- SPACEPARITY - бит чётности всегда равен 0.
#define NOPARITY 0
#define ODDPARITY 1
#define EVENPARITY 2
#define MARKPARITY 3
#define SPACEPARITY 4
- ONESTOPBIT - один стоповый бит.
- ONE5STOPBITS - полтора стоповых бита.
- TWOSTOPBITS - два стоповых бита.
#define ONESTOPBIT 0
#define ONE5STOPBITS 1
#define TWOSTOPBITS 2
Отправляется приёмником передатчику, когда в приемном буфере меньше XonLim байтов.
Отправляется приёмником передатчику, когда в приемном буфере больше XoffLim байтов.
Используется для замены символов с ошибкой контроля чётности.
Используется для сообщения о конце передаваемых данных.
В недвоичном (текстовом) режиме обмена указывал на конец передаваемых данных. В Win 32/64 не используется.
Используется для инициализации какого-либо события.
Должно быть установлено в 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.