일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- SQL
- 데이터베이스
- 설치
- MFC
- 입문
- PostgreSQL
- 델파이
- xml
- 소니
- WIN32 SDK
- winsock
- Firebird
- vb
- 기초
- 문자열
- SDK
- 초보
- VB.NET
- 파라미터
- dll
- 시리얼 통신
- Visual Studio 2005
- Visual Basic
- Delphi
- 인스톨
- MySQL
- 셋업
- 파이어버드
- c#
- 예제
- Today
- Total
프로그래밍 노트
[시리얼 통신] 포트 열기, 닫기, 시리얼 포트 상태 정보 얻기 본문
■ 시리얼 포트 오픈
시리얼 포트는 파일처럼 다룬다.
시리얼 포트를 오븐 하기위해서는 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을 호출한다.
반환값 : 성공하면 0 이외의 값, 실패하면 0을 반환한다.
■ 시리얼 포트 상태 정보 얻기
자신의 컴퓨터에 시리얼 포트는 어느 정도의 성능인지 등 보통은 신경쓰지않지만 디바이스 드라이버를 포함한 시리얼 포트의 성능을 앎으로 서포트 하지않는 보레이트를 잘못해서 설정했을 때의 부정한 설정을 막아준다.
시리얼 포트에 관한 정보는 GetCommProperties()의 호출로 COMPROC 구조체 변수를 읽어온다.
인수 :
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 | 유저 설정 |
값 | 의미 |
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를 열어 각 포트의 시리얼 포트 상태와
각 포트에 설정 가능값을 표시한다.
VS 2005