Главная страница
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.036 c
15-1154427261
lurce
2006-08-01 14:14
2006.08.27
Советский Энциклопедический Словарь в эл. виде


2-1154607978
DProject
2006-08-03 16:26
2006.08.27
Открыть два проекта одновременно


9-1133300445
Кефир87
2005-11-30 00:40
2006.08.27
OpenGL : Рендер в текстуру


6-1144755402
MadSnake
2006-04-11 15:36
2006.08.27
список подключений


15-1153994677
NeyroSpace
2006-07-27 14:04
2006.08.27
Можно ли вести автоматический подсчет количесва компиляций?