Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизDCB.flags Найти похожие ветки
← →
Yus (2006-05-02 07:07) [0]Функцией GetCommState получаю структуру DCB. Как узнать, что содержит число DCB.flags(т.е. fBinary=? fRtsControl=? и т.д.)
И как установить отдельный параметр (например RTS_CONTROL_ENABLE)
← →
tesseract © (2006-05-02 10:44) [1]работа с полученным DCB:
hdcb.BaudRate :=fBaudRate; hdcb.ByteSize := fByteSize;
hdcb.StopBits := fStopBits; hdcb.Parity := fParity;
// Устанавливаем DpCB
result:=SetCommState(hCom,hDCB);
Если хочншь поменять что-то одно, меняй в структуре DCB - объяви её глобальной чтобы каждый раз GetCommState не вызывать.
// игра с RTS / DTR
if not(EscapeCommFunction(hCom,SETDTR)) then exit;
if not(EscapeCommFunction(hCom,CLRRTS)) then exit;
← →
ECM © (2006-05-02 17:46) [2]
> Как узнать, что содержит число DCB.flags(т.е. fBinary=?
> fRtsControl=?
fBinary := DCB.Flags and 1;
fRtsControl := (fDCB.Flags and $3000) shr 12;
> как установить отдельный параметр (например RTS_CONTROL_ENABLE)
fRtsControl := 0; //RTS_CONTROL_ENABLE
fDCB.Flags := (fDCB.Flags and (not $3000)) or ((fRtsControl) shl 12);
Обычные манипуляции с битовыми полями:
:)
← →
Yus (2006-05-02 21:17) [3]Спасибо, все работает. Но что за число $3000 и почему shl 12. Формула fDCB.Flags := (fDCB.Flags and (not $3000)) or ((fRtsControl) shl 12)
не подойдет для установки (например DTR_CONTROL_ENABLE). Если не сложно, дайте пояснение формуле.
← →
ECM © (2006-05-02 21:33) [4]Все вытекает из "настоящего" определения структуры DCB (см MSDN, WinBase.h)
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;
В ней используются битовые поля - с fBinary до fDummy2 (после двоеточия размер поля в битах). В Cи оперировать с ними можно "напрямую". В Паскале они (все) отображаются на поле Flags и добираться к ним надо "врукопашную" :)
Поле RtsControl занимает 13 и 14-й биты (начиная с первого - fBinary) поэтому сдвиг на 12 и маска $3000 - это две единицы в 13 и 14 битах
Для установки DTR_CONTROL_ENABLE поэтому формула будет выглядеть так:fDtrControl := 0; //DTR_CONTROL_ENABLE
fDCB.Flags := (fDCB.Flags and (not $0030)) or ((fDtrControl) shl 4);
← →
Yus (2006-05-02 21:42) [5]Большое СПАСИБО!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c