typedef struct _DCB { // 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
);
Value | Description |
---|---|
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
);
Value | Description |
---|---|
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
);
Value | Description |
---|---|
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;
//---------------------------------------------------------//
ULONG TotalTimeout; // The Total Timeout
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 |