본문 바로가기

Hello CE,Mobile

DCB Structure


typedef struct _DCB {       // DCB

DWORD DCBlength;            // DCB구조체의 크기
DWORD BaudRate;             // 현재 보오 속도
DWORD fBinary: 1;           // binary mode설정 1로 설정하면 binary mode가능
DWORD fParity: 1;           // 패리티 검사 기능 유무
DWORD fOutxCtsFlow:1;       // CTS 지정 플러그 1이면 CTS가 1이 될 때까지 기다린다.
DWORD fOutxDsrFlow:1;       // DSR 지정 플러그 1이면 DSR이 1이 될 때 까지 기다린다.
DWORD fDtrControl:2;        // DTR 지정 플러그 DTR_CONTROL_DISBLE로 설정시 DTR이 OFF되고
                            // DTR_CONTROL_ENABLE 를 설정하면 DTR은 ON이된다.
DWORD fRtsControl:2;        // RTS는 이값이 RTS_CONTROL_DISABLE로 설정시 0이되고
                            // RTS_CONTROL_ENABLE로 설정될 때 ON이 된다.
DWORD fDsrSensitivity:1;    // 이값이 1이면 DSR이 OFF동안 받은 데이터는 무시한다.

char  XonChar;              // Tx and Rx XON character //XON,XOFF문자 지정
char  XoffChar;             // Tx and Rx XOFF character
WORD  XonLim;               // XON 문자가 보내지기 전에 수신 버퍼에서 허용되는 최소 바이트
WORD  XoffLim;              // XOFF문자가 보내지기 전에 수신 버퍼에서 허용되는 
                            //사용가능한 최소 바이트
DWORD fTXContinueOnXoff:1;  // 수신 버퍼가 꽉차있고 XoffChar 문자를 전송했을 경우
                            // 전송 중단을 할것인가를 지정하는 플러그 들
DWORD fOutX: 1;             // 전송을 할 동안 XON/XOFF 흐름제어를 사용할 것인지 지정
                            // 만약 이 값이 TRUE일 경우 
                            // XonChar 문자를 받았을 경우 송신
                            // XoffChar 문자를 받았을 경우 송신 중지
DWORD fInX: 1;              // 수신이 되는 동안 XON/XOFF 흐름제어를 사용할 것인지 지정
                            // 만약 이 값이 TRUE일 경우 
                            // XoffLim 바이트로 입력버퍼가 가득찼을 때 XoffChar 문자가 보내짐 
                            // 입력버퍼가 XonLim 바이트 이하로 비었을 때 XonChar 문자가 보내짐
DWORD fErrorChar: 1;        // 이값이 1이고 fParity가 1이면 패리티 오류와 함께 수신된
                            // 바이트들은 ErrorChar멤버에 의해 지정된 문자로 대체된다.
DWORD fNull: 1;             // 이값이 1이면 널값은 무시한다.
DWORD fAbortOnError:1;      // 이값이 1이면 오류가 발생하였을 때 읽기와 쓰기 작동이 중단된다.
BYTE  ByteSize;             // 포트에 의해 현재 사용되는 데이터 비트수
BYTE  Parity;               // 0-4=no,odd,even,mark,space
BYTE  StopBits;             // 0,1,2 = 1, 1.5, 2
char  ErrorChar;            // 오류에 의해 전달된 문자 전환
char  EofChar;              // binary 모드가 아닐 경우 데이터의 끝을 나타내는 문자
char  EvtChar;              // 이문자가 수신될 때 이벤트가 발생
WORD  wReserved1;           // reserved; do not use
WORD  wReserved;            // not currently used
DWORD fDummy2:17;           // reserved
} DCB;


** DWORD fDtrControl:2;

   DTR_CONTROL_DISABLE 장치를 열었을 때 DTR 라인을 저위로 한다. 

   DTR_CONTROL_ENABLE  장치를 열었을 때 DTR 라인을 고위로 한다. 

   응용프로그램은 EscapeCommFunction으로 조정할 수 있다. 

   DTR_CONTROL_HANDSHAKE DTR 흐름제어 신호 변경 가능하도록 한다. 

   이 값이 사용되면 EscapeCommFunction으로 조정할 때 오류가 발생한다.


================================================================

 Serial Communications Functions

================================================================

BOOL EscapeCommFunction(

  HANDLE hFile,

  DWORD dwFunc

);

ValueDescription

CLRBREAK

문자 전송을 복원 하고, 전송 라인을 nonbreak 상태로 변경 

ClearCommBreak 사용하여 사용할 수 있음.

CLRDTR

DTR 시그널을 클리어

CLRIR

일반 시리얼 모드 사용. Windows Embedded CE 에서만 사용 가능

CLRRTS

RTS 시그널을 클리어

SETBREAK

문자 전송을 멈추고,  ClearCommBreak 함수가 불리기 전까지 전송 라인을 break 상태로 변경.

SetCommBreak 함수로 사용가능 하며 이 함수는 전송되지 않은 데이터를 지우지 않는다.

SETDTR

DTR 신호를 보냄

SETIR

적외선 모드 사용 Windows Embedded CE 에서만 사용 가능

SETRTS

RTS 신호를 보냄

SETXOFF

Causes transmission to act as if an XOFF character has been received.

SETXON

Causes transmission to act as if an XON character has been received.



BOOL WaitCommEvent(

  HANDLE hFile,

  LPDWORD lpEvtMask,

  LPOVERLAPPED lpOverlapped

);

ValueDescription

EV_BREAK

입력에서 BREAK 가 감지 되었다.

EV_CTS

CTS 신호 상태 변경

EV_DSR

DSR 신호 상태 변경

EV_ERR

선로 오류 발생 (프레임 오류, 패리티 오류, 오버런 오류)

EV_POWER

장치에 Power On 시

EV_RING

벨 신호 감지

EV_RLSD

RLSD 신호 감지

EV_RXCHAR

문자 수신

EV_RXFLAG

이벤트 문자 수신 (DCB의 EvtChar)

EV_TXEMPTY

문자 송신 완료


BOOL PurgeComm(

  HANDLE hFile,

  DWORD dwFlags

);

ValueDescription

PURGE_RXABORT

read 함수가 완료되지 않았더라도 모든 overlapped write 종료하고 리턴

PURGE_RXCLEAR

입력 버퍼 클리어

PURGE_TXABORT

write 함수가 완료되지 않았더라도 모든 overlapped write 종료하고 리턴

PURGE_TXCLEAR

출력 버퍼 클리어


================================================================

 Timeout 설정

================================================================

typedef struct _COMMTIMEOUTS {

    DWORD ReadIntervalTimeout;          /* Maximum time between read chars. */

    DWORD ReadTotalTimeoutMultiplier;   /* Multiplier of characters.        */

    DWORD ReadTotalTimeoutConstant;     /* Constant in milliseconds.        */

    DWORD WriteTotalTimeoutMultiplier;  /* Multiplier of characters.        */

    DWORD WriteTotalTimeoutConstant;    /* Constant in milliseconds.        */

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;


ReadIntervalTimeout  : 두 문자 사이의 읽기 사이에 경과할 수 있는 시간
TotalTimeoutConstant : 특정 바이트 수를 읽거나 쓰는데 필요한 전체시간이며                                              TotalTimeoutMultiplier 이 시간이 0 이더라도 고정된 타임 아웃 값이다. (아래 MDD 부분확인)

//---------------------------------------------------------//

// MDD 에서 위 변수를 이용해서 TotalTimeout 계산 하는 소스
//---------------------------------------------------------//

ULONG TotalTimeout;   // The Total Timeout

TotalTimeout = pSerialHead->CommTimeouts.WriteTotalTimeoutMultiplier*NumberOfBytes +
                   pSerialHead->CommTimeouts.WriteTotalTimeoutConstant;
TotalTimeout = pSerialHead->CommTimeouts.ReadTotalTimeoutMultiplier*BufferLength +

                   pSerialHead->CommTimeouts.ReadTotalTimeoutConstant;


================================================================

 흐름 제어

================================================================

  • 소프트웨어 
  • 하드웨어

================================================================

 송수신 방법

================================================================

폴링, 동기 I/O, 비동기 I/O, 이벤트 지향 I/O


● 폴링

  . 수신 버퍼에 데이터가 존재하면 읽고, 없으면 계속 읽기를 시도한다.

  . CPU 시간을 많이 소모한다.

  . ReadIntervalTimeout을 MAXWORD로 설정하고 나머지 값은 0으로 설정하고 

    ReadFile() 함수를 호출한다. MAXWORD 동안 문자가 수신되지 않으면 리턴한다.


● 동기 I/O

  . ReadIntervalTimeout은 0으로 설정되지만 전체 타임아웃은 지정한다.

  . ReadFile() 함수를 호출하면 지정된 비이트수가 읽혀지거나 전체 타임아웃이 될 때까지 

    함수가 반환되지      않는다. - 블록킹 모드


● 비동기 I/O

  . 전방에서 다른 작업을 수행하고 있는 동안에 배경에서 읽기나 쓰기를 수행할 수 있다.

    비동기 I/O를 수행하려면, 

    포트를 Create할 때, fdwAttrsAndFlags를 FILE_FLAG_OVERLAPPED로 설정하고, 

    ReadFile()의 마지막 파라미터를 OVERLAPPED 구조체 변수로 지정해야 한다.


'Hello CE,Mobile' 카테고리의 다른 글

SecProcPermissions() API  (0) 2010.01.25
SetForegourndWindow  (0) 2010.01.18
CString 형변환  (1) 2009.12.17
far*  (0) 2009.12.17
IsAPIReady()  (0) 2009.12.15