시리얼 포트 설정

시리얼 I/O의 파라미터 설정은 SetCommState()로 하고 GetCommState()로 설정된 파라미터 정보를
볼 수 있다.

BOOL SetCommState(
    HANDLE  hFile,     // 통신 디바이스 핸들
    LPDCB    lpDCB    // DCB 구조체 포인터
};


인수:
hFile:
  CreateFile()에서 반환된 핸들

lpDCB:
  현재 설정된 다비아스 상태를 가지고 있는 DCB 구조체 포인터

반환값
  성공하면 0이 아니고 실패하면 0

BOOL GetCommState(
    HANDLE  hFile,     // 통신 디바이스 핸들
    LPDCB    lpDCB    // DCB 구조체 포인터
};


인수:
hFile:
  CreateFile()에서 반환된 핸들

lpDCB:
  현재 설정된 다비아스 상태를 가지고 있는 DCB 구조체 포인터

반환값
  성공하면 0이 아니고 실패하면 0


두함수의 파라미터인 DCB구조체의 맴버변수

typedef struct _DCB{             // dcb
  DWORD DCBlength;              // DCB 사이즈
  DWORD BaudRate;               //  현재 보레이트
  DWORD fBinary:1;                 // 바이너리 모드, EOF 체크안함
  DWORD fParity:1;                  // 패리티 체크
  DWORD fOutxCtsFlow:1;        // CTS 출력 플로제어
  DWORD fOutxDsrFlow:1;        // DSR 출력 플로제어
  DWORD fDtrControl:2;            // DTR 플로 제어 타입
  DWORD fDsrSensitivity:1;       // DSR 감지
  DWORDfTXContinueOnXoff:1; // XOFF라고 계속 전송
  DWORD fOutX:1;                   // XON/XOFF 외부 플로 제어
  DWORD fInX:1;                     // XON/XOFF 내부 플로 제어
  DWORD fErrorChar:1;            // 오류 수정(에러 치환 가능)
  DWORD fNull:1;                    // 수신 데이터의 NULL 없애기
  DWORD fRtsControl:2;           // RTS 플로 제어
  DWORD fAbortOnError:1;        // 에러 발생시 입출력 취소
  DWORD fDummy2:17;             // 예약
  WORD wReserved ;              // 현재 미사용
  WORD XonLim;                     // 송신 XON 제한치
  WORD XoffLim;                     // 송신 XOFF 제한치
  BYTE ByteSize;                   // 1바이트의 비트 수, 4-8
  BYTE Parity;                        // 0~4, 패리티 없음, 홀수, 짝수, 마크, 스페이스
  BYTE StopBits;                    // 0~2 = 1, 1.5, 2
  char XonChar;                     // 송수신 XON 문자
  char XoffChar;                     // 송수신 XOFF 문자
  char ErrorChar;                    // 에러 치환 문자
  char EofChar;                      // 입력 종료 문자
  char EvtChar;                      // 수신 이벤트 문자
  WORD wReserved1;             // 예약, 사용불가
}DCB;

DCBlength
DCB구조체의 길이 지정

BaudRate
통신 디바이스가 동작하는 Baud rate 지정

fBinary
바이너리 모드 지정
Win32 API는 비 바이너리 모드 전송을 지원안함
따라서 TRUE로 설정해야 되고 FALSE로 설정하면 동작하지 않음

fParity
패리티 체크 지정
TRUE로 설정하면 패리티 체크가 유효화되고 에러가 보고된다.

fOutxCtsFlow
송신 플로 제어를 위해 CTS 신호 감시 여부 지정
TRUE로 설정하면 CTS가 비활성화 되면 다시 CTS가 활성화 될때까지 송신이 중단됨

fOutxDsrFlow
송신 플로 제어를 위해 DSR 신호 감시 여부 지정
TRUE로 설정하면 DSR가 비활성화 되면 다시 DSR가 활성화 될때까지 송신이 중단됨

fDtrControl
DTR 플로 제어 지정

    DTR_CONTROL_DISABLE
    DTR 디바이스가 오픈되어 그것이 금지 상태일 경우
    DTR 라인을 비활성화
    DTR_CONTROL_ENABLE 
    디바이스가 오픈되어 그것이 ON인 상태인 경우
    DTR 라인을 활성화
    DTR_CONTROL_HANDSHAKE
    DTR 핸드쉐이크를 가능하게 함
    만약 DTR 핸드쉐이크를 가능하게 설정하면 어플리케이션에 의해
    EscapeCommFunction 함수를 사용하요 라인을 조정하면 에러가 됨

fDsrSensitivity
통신 드라이버가 DSR 시그널 상태에 민감한지를 지정
TRUE로 설정하면 DSR 모뎀 입력 라인이 YES인한 드라이버는 수신한 모든 바이트를 무시

fTXContinueOnXoff
상대의 입력 버퍼가 FULL이고 드라이버가 XoffCha문자를 보냈을 때에
송신을 정지할 것인가를 지정
TRUE로 설정하면 상대의 입력 버퍼가 버퍼 사이즈 XoffLim 바이트가 되어
수신 정지가 되기 때문에 XoFF 케릭터를 보내도 송신을 계속함
FALSE로 설정하면 상대의 입력 버퍼가 XonLim이 되어 XON케릭터를 송신다시 하기 위해
보낼때 까지 송신하지 않음

fOutX
송신 사이에 XON/XOFF 플로 제어 사용 지정
TRUE로 설정하면 XoffChar문자를 수신했을 때 송신을 정지하고
XonChar문자를 수신하면 송신을 재개함

fInX
수신 사이에 XON/XOFF 플로 제어 사용 지정
TRUE로 설정하면 입력 버퍼 중에 수신 데이터가 XoffLim이 된 경우
XoffChar문자가 보내지고 XonLim이 된 경우 Xonchar 문자가 송신됨

fErrorChar
패리티가 틀린 데이터를 수신했을 때, ErrorChar 변수에 의해 지정된 문자 치환 지정
TRUE로 설정하면 fParity가 TRUE이면 패리티 에어시 ErrorChar와 수신 데이터를 바꿈

fNull
무효한 수신 데이터 처분 지정
TRUE로 설정하면 수신하지 않고 무효한 데이터를 데이터를 처분한다.

fRtsControl
RTS 플로 제어 지정
값이 0이면 RTS_CONTROL_HANDSHAKE이다.
    RTS_CONTROL_DISABLE
    RTS 디바이스가 오픈되어 그것이 금지 상태일 경우
    RTS 라인을 비활성화
    RTS_CONTROL_ENABLE 
    디바이스가 오픈되어 그것이 ON인 상태인 경우
    RTS 라인을 활성화
    RTS_CONTROL_HANDSHAKE
    RTS 핸드쉐이크를 가능하게 함
    드라이버는 입력 버퍼중에 수신 데이터가 반이하가 되면
    RTS라인을 올리고 3/4이하인 경우에는 내린다.
    RTS 핸드쉐이크를 가능하게 설정하면 어플리케이션에 의해
    EscapeCommFunction 함수를 사용하요 라인을 조정하면 에러가 됨

fAbortOnError
에러가 발생한 경우 송수신을 종료할것인지를 지정
TRUE로 설정하면 에러 스테이터스가 에러 발생했을 때
모든 송수신 동작이 종료함
드라이버는 어플리케이션이 ClearCommError함수를 불러 에러에
응답할 때 까지 어떤 통신 조작도 할 수 없음

fDummy2
사용안함

wReserved
사용안함 / 반드시 0을 설정해야 됨

XonLim
XON문자가 보내질 때까지 입력 버퍼에 허용되는 최소 바이트 수를 지정

XoffLim
XOFF문자가 보내질 때까지 입력 버퍼에 허용되는 최대 바이트 수를 지정
최대 허가 바이트 수는 이 값을 입력 버퍼 사이즈(바이트)에서 뺌으로 계산됨

ByteSize
송수신 바이트의 비트 수를 지정

Parity
사용되는 패리티 스킴을 지정

StopBits
사용되는 스탑 비트를 지정

XonChar
송수신을 위한 XON문자의 값을 지정

XoffChar
송수신을 위한 XOFF문자의 값을 지정

ErrorChar
틀린 패리티를 수신한 바이트를 교환하기 위한 준비된 문자 값

EofChar
데이터의 끝을 시그널로 전하기 위해 사용되는 문자 값

EvtChar
이벤트를 시그널로 전하기 위해 사용되는 문자 값

wReserved1
사용하지 않음



 

invalid-file

DCB 정보 보기

VS2005로 작성한 DCB정보 보기 예제
인터넷에 소스를 대충 편집한거여서 소스가 지저분함
컴포트도 MyCommPage.cpp 파일에

  CString CommName = "COM1";

이렇게 고정으로 만들었다.(고치기가 귀찮아서)
여러 파일이 있기는 하지만 다 보이지 않게 하고
MyDCBPage1.cpp만 참고로 하면 될 것같다.

Posted by 띠리

WIN32 SDK에서 시리얼 통신을 하려면...

WinAPI에서는 시리얼 포트도 파일처럼
CreateFile로 파일을 열고
WriteFile로 데이터를 쓰거나
ReadFile로 데이터를 읽거나
CloseHandle로 파일을 닫는다.
일반적으로 파일을 다루는 것과 비슷하지만 시리얼 통신에서는
여기에다가 통신을 하기위한 설정이 필요한다.
SetCommState가 이런한 설정을 하게된다.

시리얼 통신을 하기위한 순서는

1) CreateFile로 파일을 연다.
2) SetCommState함수로 통신포트의 설정을 한다.
3) ReadFile이나 WriteFile로 데이터를 송수신한다.
4) CloseHandle로 파일을 닫는다.


시리얼 통신을 하기위해서는 Windows에서는 HANDLE형의 변수로 파일등의 오브젝트를 구별하여 억세스나 조작을 하게 된다.
이 때 사용하는 시리얼 포트를 특정하기 위해서는 HANDLE형 변수가 필요하다.
다음으로 WinAPI에서는 시리얼 포트의 설정값을 다르는 구조체로서 DCB구조체를 사용한다.
또 시리얼 포트의 타임 아웃 설정값을 다루는 COMMTIMEOUTS구조체가 있다.

Posted by 띠리
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 995,627
Today : 117 Yesterday : 316