Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.063 c
2-1154670842
Генадий
2006-08-04 09:54
2006.08.27
Dspack


2-1154950938
webpauk
2006-08-07 15:42
2006.08.27
TstringList.AddObject


15-1154423861
VitV
2006-08-01 13:17
2006.08.27
Как обеспечить полную безопастность ICQ-общения?


2-1154930963
валет
2006-08-07 10:09
2006.08.27
word


2-1155026269
Hadroran
2006-08-08 12:37
2006.08.27
Даже не знаю как тему назвать