시리얼 포트를 열어보자.

 

 리눅스에서 입출력은 모두 파일로 간주되어 처리된다. 키보드 입력 화면 출력도 0,1 번 파일디스크립터를 이용하고, 통신 IO인 소켓도 아래와 같이 파일디스크립터인 int로 받아 동작을 제어한다. 소켓의 파일 디스크립터를 printf로 출력해보면 해당 파일디스크립터가 몇번인지 출력할 수도 있다. 어디에서 쓰고 읽을 것인지를 int로 처리하고 있다고 볼 수 있다.

 

int sock = socket(PF_INET,SOCK_STREAM,0); // 소켓도 그냥 int 값의 파일 디스크립터다

 

즉, 유닉스 기반 OS에서 입출력에 관련된 모든 작업은 파일을 통해 가능하다. 이 입출력장치에는 네임드 파이프, 소켓같은 통신 IO와 진짜 파일로 저장하기 위한 IO 장치 등이 포함 된다. 시리얼 통신 포트도 예외는 아니다. 다만 윈도우에서는 파일 디스크립터와 유사한 핸들이라는 것을 사용하는 것만 다를 뿐, 위에서 설명한 것과 동일하게 시리얼 통신포트를 열 수 있도록 CreateFile이라는 함수를 제공한다.

 

CreateFile 함수의 원형은 아래와 같다.

 

 

각 인자들에 대한 설명을 하자면..

 

lpFileName : 파일 이름. 시리얼 COM포트 같은 경우 \\.\COM1과 같은 형식을 따른다.

dwDesiredAccess : 파일 권한이다. 읽고쓰기가 가능하게 하려면 아래와 같이 쓰면 된다.

                             GENERIC_READ | GENERIC_WRITE

dwshareMode : 시리얼 통신에서는 포트를 공유할 수 없으니까 0이다.

lpSecurityAttributes : 정확히는 모르겠으나 사용하지 않는다.

dwCreateDisposition : 파일의 생성 방식이다. 시리얼 통신은 이미 있는 포트를 여는 거니까

                                OPEN_EXISTING 을 사용한다.

dwFlagsAndAttributes : 파일 속성에 대한 의미다. 우리는 Overlapped 읽기 쓰기를 사용 하

                                  기때문에 FILE_FLAG_OVERLAPPED를 넣으면 된다.

hTemplateFile : 뭔지 모르겠지만 사용하지 않아 0을 넣는다.


 

 

그런데, 사실 FILE_ATTRIBUTE_NORMAL은 단독으로 사용되는 것 이외에는 효력이 없다고 하니 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED 는FILE_FLAG_OVERLAPPED와 같은 말이다. 

 

어찌 됐든 위와 같이 타이핑하면 일단 가지고 놀 시리얼 포트를 열 수 잇다.

(물론 COM 포트 번호는 제어판 -> 장치관리자 에서 확인해서 넣어야 한다.)

 

자세한 함수 인자들에 대한 명세는 아래를 참조하면 알 수 있다.

 

 

 

 

 

 

 

Posted by 굿쟌
,