프로그래밍 노트

[시리얼 통신] 포트 열기, 닫기, 시리얼 포트 상태 정보 얻기 본문

MFC TIP

[시리얼 통신] 포트 열기, 닫기, 시리얼 포트 상태 정보 얻기

띠리 2007. 10. 22. 21:29


시리얼 포트 오픈

시리얼 포트는 파일처럼 다룬다.
시리얼 포트를 오븐 하기위해서는 CreateFile()을 사용한다.

HANDLE CreateFile(
  LPCTSTR lpFileName,         // 포트 이름을 가르키는 버퍼의 포인터
  DWORD dwDesiredAccess,       // 억세스모드(READ, WRITE)
  DWORD dwShareMode,          // 포트의 공유 방법 비정(공유 불가: 0으로 설정)
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 시큐리티 속성
  DWORD dwCreationDisposition,  // 포트 여는 방법 지정(OPEN_EXISTING로 기존 파일 지정)
  DWORD dwFlagsAndAttributes,   // 포트의 속성 지정
  HANDLE hTemplateFile          // 템플레이트 파일의 핸들(항상 NULL로 지정)
 );


인수:

lpFileName: COM1이나 COM2등의 시리얼 포트 이름을 지정한다.
(LPT1같은 프린터 포트도 지정할 수 있다.)

dwDesiredAccess: 이하의 읽기 모드를 단독 또는 OR로 지정한다.

의미
0 디바이스의 속성을 묻는다.
GENERIC_READ 읽기 억세스.
읽기 쓰기를 할때는 GENERIC_WRITE를 조합해서 지정
GENERIC_WRITE 쓰기 억세스.
쓰기 쓰기를 할때는 GENERIC_READ를 조합해서 지정

일반적으로 시리얼 포트는 입출력이 가능하기 때문에 GENERIC_READ | GENERIC_WRITE로 설정한다.

dwShareMode : 포트의 공유모드로 이하의 값을 단독이나 OR로 지정한다.
0을 지정하면 공유하지 않는다.
 
 
의미
FILE_SHARE_DELETE Windows NT 일 경우만 : 
후속의 오픈 조작으로 삭제 억세스가 요구될 때, 그 오픈을 허가
FILE_SHARE_READ 후속의 호픈 조작으로 읽기 억세스가 요구될 때 그 오픈을 허가
FILE_SHARE_WRITE 후속의 호픈 조작으로 쓰기 억세스가 요구될 때 그 오픈을 허가

 
 포트는 파일과 달리 공유할수 없기 때문에 0으로 지정한다. 이 경우는 이미 오픈 되어진 포트를 다른 프로세스가 오픈 하려고 하면 CreateFile()은 에러가 된다. 하지만 같은 프로세스의 복수 스레드는 CraeteFile()로 반환된 핸들을 공유할 수 있다.

lpSecurityAttributes : 시큐리티 속성으로 SECURITY_ATTRIBUTES 구조체의 포인터이다.
NULL을 설정하면 핸들은 자식 프로세스에 계승되어지지않는다.

dwCreationDisposition : 파일이 존재할 때 또는 존재하지 않을 때, 각각의 동작을 지정한다.
시리얼 포트는 기존 파일 이외에 있을 수 없기 때문에 OPEN_EXISTING을 지정한다.

dwFlagsAndAttributes : 파일의 속성 및 플래그를 지정한다.
시리얼 포트에서 사용할만한 플래그는 FILE_FLAG_OVERLAPPED 뿐이다.

의미
FILE_FLAG_OVERLAPPED 시간이 걸리는 처리에 있어서 ERROR_IO_PENDING을 반환하도록 한다. 처리가 끝나면 이벤트가 시그널 상태로 설정된다.
이 플래그를 지정했을 때는 ReadFile 함수나 WriteFile 함수로 OVERLAPPED 구조체를 지정해야만 된다.


hTemplateFile : 시리얼 포트에 관계없기 때문에 NULL을 지정한다.


시리얼 포트 클로즈

클로즈는 CreateFile()이 반환하는 핸들을 인수로 하여 CloseHandle을 호출한다.

BOOL CloseHandle( HANDLE hObject );


반환값 : 성공하면 0 이외의 값, 실패하면 0을 반환한다.

시리얼 포트 상태 정보 얻기

자신의 컴퓨터에 시리얼 포트는 어느 정도의 성능인지 등 보통은 신경쓰지않지만 디바이스 드라이버를 포함한 시리얼 포트의 성능을 앎으로 서포트 하지않는 보레이트를 잘못해서 설정했을 때의 부정한 설정을 막아준다.

시리얼 포트에 관한 정보는 GetCommProperties()의 호출로 COMPROC 구조체 변수를 읽어온다.

BOOL GetCommProperties (HANDLE hFile, LPCOMMPROP lpCommProp );


인수 :

hFile : 통신 디바이스의 핸들
CreateFile함수가 반환하는 핸들

lpCommProp : 통신 특성 정보가 반환되어 COMPROC 구조체의 포인터

반환값 : 함수가 성공하면 0 이외의 값, 실패하면 0을 반환한다.

LPCOMMPROP 구조체는 이하의 구성의 시리얼 포트 정보를 가진다.

typedef struct _COMMPROP{
  WORD wPacketLength;     // 구조체 사이즈
  WORD wPacketVersion;    // 구조체 버젼
  DWORD dwServiceMask;    // 실행된 서비스
  DWORD dwReserved1;      // 예약
  DWORD dwMaxTxQueue;    // 바이트 단위의 최대 송신 버퍼 사이즈
  DWORD dwMaxRxQueue;    // 바이트 단위의 최대 수신 버퍼 사이즈
  DWORD dwMaxBaud;      // 보레이트 최대값
  DWORD dwProvSubType;       // 특정 프로바이더 타입
  DWORD dwProvCapabilities;     // 서포트된 함수
  DWORD dwSettableParams;      // 변경 가능 파라미터
  DWORD dwSettableBaud;     // 허가된 보레이트
  WORD wSettableData;        // 허가된 바이트 사이즈
  WORD wSettableStopParity;      // 스탑 비트 / 패리티 허가
  DWORD dwCurrentTxQueue;     // Tx 버퍼 사이즈
  DWORD dwCurrentRxQueue;     // Rx 버퍼 사이즈
  DWORD dwProvSpec1;       // 프로바이더 특정 데이터
  DWORD dwProvSpec2;       // 프로바이더 특정 데이터
  WCHAR wcProvChar[1];       // 프로바이더 특정 데이터
}COMMPROP;

dwServiceMask : 시링러 포트의 경우는 항상 SP_SERIALCOMM이다.
dwReserved1 : 미사용
dwMaxTxQueue : 출력 버퍼의 최대값(바이트), 0을 설정하면 무제한
dwMaxRxQueue : 입력 버퍼의 최대값(바이트), 0을 설정하면 무제한
dwMaxBaud : 이하의 상수로 설장 가능한 보레이트의 최대값

의미
BAUD_075 75 bps
BAUD_110 110 bps
BAUD_134_5 134.5 bps
BAUD_150 150 bps
BAUD_300 300 bps
BAUD_600 600 bps
BAUD_1200 1200 bps
BAUD_1800 1800 bps
BAUD_2400 2400 bps
BAUD_4800 4800 bps
BAUD_7200 7200 bps
BAUD_9600 9600 bps
BAUD_14400 14400 bps
BAUD_19200 19200 bps
BAUD_38400 38400 bps
BAUD_56K 56K bps
BAUD_57600 57600 bps
BAUD_115200 115200 bps
BAUD_128K 128K bps
BAUD_USER 유저 설정

dwProvSubType : 이하의 상수로 CreateFile()에 의해 작성된 통신 디바이스가 무엇을 서포트하는지를 알려준다. 시리얼 포트의 경우는 PST_RS232가 된다.

의미
PST_FAX 팩스
PST_LAT LAT 프로토콜
PST_MODEM 모뎁
PST_NETWORK_BRIDGE 미정의 네트워크 브릿지
PST_PARALLELPORT 패럴렐 포트
PST_RS232 RS-232 시리얼 포트
PST_RS422 RS-422 포트
PST_RS423 RS-423 포트
PST_RS449 RS-449 포트
PST_SCANNER 스캐너
PST_TCPIP_TELNET TCP/IP TelnetR 프로토콜
PST_UNSPECIFIED 미정의
PST_X25 X.25 스탠다드


dwProvCapabilities : 이하의 상수로 시리얼 포트가 서포트 하는 기능을 보여준다.
통산의 리리얼 포트 드라이버는 PCF_16BITMODE와 PCF_SPECIALCHARS 이외는 대체적으로 서포트한다.

의미
PCF_16BITMODE 특별한 16비트 모드를 서포트
PCF_DTRDSR DTR/DSR 서포트
PCF_INTTIMEOUTS 인터벌 타임아웃을 서포트
PCF_PARITY_CHECK 패리티 체크 서포트
PCF_RLSD RLSD(CD) 서포트
PCF_RTSCTS RTS/CTS 서포트
PCF_SETXCHAR 설정 가능한 XON/XOFF 서포트
PCF_SPECIALCHARS 설정 가능한 특수문자 서포트
PCF_TOTALTIMEOUTS 토탈 타임아웃 서포트
PCF_XONXOFF XON/XOFF 플로 제어 서포트

dwSettableParams : 이하의 상수로 설정 변경 가능한 파라미터를 나타낸다.

의미
SP_BAUD 보레이트
SP_DATABITS 1케릭터의 비트수
SP_HANDSHAKING 핸드 쉐이크 방식(플로 제어)
SP_PARITY 패리티 비트 수
SP_PARITY_CHECK 패리티 체크의 유무
SP_RLSD RLSD(CD)
SP_STOPBITS 스톱 비트 수

dwSettableBaud : 설정 가능한 모든 보레이트의 종류를 dwMaxBaud의 항목으로 정의된 상수값으로 OR한 값을 나타낸다.

wSettableData : 이하의 상수의 OR로 설정 가능한 1 케릭터의 비트 수를 나타낸다.
시리얼 포트에서는 5~8이 서포트 된다.

의미
DATABITS_5 5 data bits
DATABITS_6 6 data bits
DATABITS_7 7 data bits
DATABITS_8 8 data bits
DATABITS_16 16 data bits
DATABITS_16X 시리얼 회선을 사용한 특수한 와이드 버스

wSettableStopParity : 이항의 상수의 OR로 설정 가능한 스톱 비트 수와 패리티를 나타낸다.

의미
STOPBITS_10 1  스톱 비트
STOPBITS_15 1.5 스톱 비트
STOPBITS_20 2 스톱 비트
PARITY_NONE 패리티 없음
PARITY_ODD 홀수 패리티
PARITY_EVEN 짝수 패리티
PARITY_MARK 마크  패리티
PARITY_SPACE         스페이스 패리티


dwCurrentTxQueue : 현재 송신 버퍼 사이즈를 나타낸다.

dwCurrentRxQueue : 현재 수신 버퍼 사이즈를 나타낸다.

시리얼 포트의 상태를 얻기 예제

COMMPROP구조체의 주요 내용을 표시하는 프로퍼티 시트 예제

이 예제는 컴포트1에서 4까지를 고정으로 오픈한다.
(요즘 기본적으로 컴포트가 없는 컴퓨터가 많아서 USB를 쓰는 사람은
컴포트를 1에서 읽는 것을 좀 수정할 필요가 있다.
USB 컴포트가 3이나 4로 잡히면 그냥 실행시켜도 문제없다.)

컴포트 1에서 4를 열어 각 포트의 시리얼 포트 상태와
각 포트에 설정 가능값을 표시한다.
invalid-file

VS 2005



Comments