31
Chapter 12. 직직 직직직 직직 직직직직

Chapter 12. 직렬 통신과 무선 프로토콜

  • Upload
    vanya

  • View
    55

  • Download
    3

Embed Size (px)

DESCRIPTION

Chapter 12. 직렬 통신과 무선 프로토콜. 학습 목표. 윈도우 API 를 이용한 직렬 통신 기법을 익힌다 . 소켓 (IrSock) 을 이용한 IrDA 프로그래밍 기법을 익힌다 . 다양한 블루투스 프로그래밍 기법을 개관한다. 직렬 통신 기초 (1/4). 직렬 통신의 중요성 학교 ( 전자 / 컴퓨터 분야 ) 실험이나 산업 현장에서 각종 장비를 제어하는 목적으로 많이 사용 무선 프로토콜 (IrDA, 블루투스 ) 을 이용한 통신에도 직렬 통신 프로그래밍 모델을 그대로 사용 가능. 1. - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter  12. 직렬 통신과 무선 프로토콜

Chapter 12.

직렬 통신과 무선 프로토콜

Page 2: Chapter  12. 직렬 통신과 무선 프로토콜

- 2 -

학습 목표

• 윈도우 API 를 이용한 직렬 통신 기법을 익힌다 .• 소켓 (IrSock) 을 이용한 IrDA 프로그래밍 기법을

익힌다 .• 다양한 블루투스 프로그래밍 기법을 개관한다 .

Page 3: Chapter  12. 직렬 통신과 무선 프로토콜

- 3 -

직렬 통신 기초 (1/4)

• 직렬 통신의 중요성– 학교 ( 전자 / 컴퓨터 분야 ) 실험이나 산업 현장에서 각종

장비를 제어하는 목적으로 많이 사용– 무선 프로토콜 (IrDA, 블루투스 ) 을 이용한 통신에도 직렬

통신 프로그래밍 모델을 그대로 사용 가능

Page 4: Chapter  12. 직렬 통신과 무선 프로토콜

- 4 -

직렬 통신 기초 (2/4)

• RS-232C 표준 9 핀 직렬 포트 (male)

7

8

9

62

3

4

5

1 DCD (Data Carrier Detect)

RX (Received Data)

TX (Transmitted Data)

DTR (Data Terminal Ready)

GND (Signal Ground)

DSR (Data Set Ready)

RTS (Request To Send)

CTS (Clear To Send)

RI (Ring Indicator)

Page 5: Chapter  12. 직렬 통신과 무선 프로토콜

- 5 -

직렬 통신 기초 (3/4)

• PC- 모뎀 vs. PC-PC 직렬 통신

DCD ①RX ②TX ③

DTR ④GND ⑤DSR ⑥RTS ⑦CTS ⑧

RI ⑨

① DCD② RX③ TX④ DTR⑤ GND⑥ DSR⑦ RTS⑧ CTS⑨ RI

PC 모뎀

DCD ①RX ②TX ③

DTR ④GND ⑤DSR ⑥RTS ⑦CTS ⑧

RI ⑨

① DCD② RX③ TX④ DTR⑤ GND⑥ DSR⑦ RTS⑧ CTS⑨ RI

PC PC

Page 6: Chapter  12. 직렬 통신과 무선 프로토콜

- 6 -

직렬 통신 기초 (4/4)

• 용어– 시작 비트 (start bit),

데이터 비트 (data bits), 정지 비트 (stop bits)

– 패리티 (parity)– 흐름 제어 (flow control)

• XON/XOFF ( 소프트웨어 )• RTS/CTS ( 하드웨어 )• DTR/DSR ( 하드웨어 )

Page 7: Chapter  12. 직렬 통신과 무선 프로토콜

- 7 -

직렬 통신 함수 (1/9)

• 직렬 통신 절차① 직렬 포트를 연다 (open).② 직렬 포트의 각종 설정값을 변경한다 .③ 읽기와 쓰기 타임아웃을 설정한다 .④ 직렬 포트로부터 데이터를 읽거나 (read) 쓴다 (write).⑤ 직렬 포트를 닫는다 (close).

Page 8: Chapter  12. 직렬 통신과 무선 프로토콜

- 8 -

직렬 통신 함수 (2/9)

• 열기와 닫기

// 포트 열기HANDLE hComm = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if(hComm == INVALID_HANDLE_VALUE) err_quit("CreateFile()");...// 포트 닫기CloseHandle(hComm);

Page 9: Chapter  12. 직렬 통신과 무선 프로토콜

- 9 -

직렬 통신 함수 (3/9)

• 각종 설정값 변경하기

BOOL GetCommState ( HANDLE hFile, LPDCB lpDCB) ; 성공 : 0 이 아닌 값 , 실패 : 0

BOOL SetCommState ( HANDLE hFile, LPDCB lpDCB) ; 성공 : 0 이 아닌 값 , 실패 : 0

Page 10: Chapter  12. 직렬 통신과 무선 프로토콜

- 10 -

직렬 통신 함수 (4/9)

• 각종 설정값 변경하기 – 예제 코드

// 포트 설정값 얻기DCB dcb;if(!GetCommState(hComm, &dcb)) err_quit("GetCommState()");

// 포트 설정값 변경dcb.BaudRate = CBR_57600;dcb.fParity = FALSE;dcb.fNull = FALSE;dcb.ByteSize = 8;dcb.Parity = NOPARITY;dcb.StopBits = ONESTOPBIT;if(!SetCommState(hComm, &dcb)) err_quit("SetCommState()");

Page 11: Chapter  12. 직렬 통신과 무선 프로토콜

- 11 -

직렬 통신 함수 (5/9)

• 읽기와 쓰기 타임아웃 설정하기

BOOL GetCommTimeouts ( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts) ; 성공 : 0 이 아닌 값 , 실패 : 0

BOOL SetCommTimeouts ( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts) ; 성공 : 0 이 아닌 값 , 실패 : 0

Page 12: Chapter  12. 직렬 통신과 무선 프로토콜

- 12 -

직렬 통신 함수 (6/9)

• 읽기와 쓰기 타임아웃 설정하기 – 관련 구조체

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;

Page 13: Chapter  12. 직렬 통신과 무선 프로토콜

- 13 -

직렬 통신 함수 (7/9)

• 읽기와 쓰기 타임아웃 설정하기 – 예제 코드

// 읽기와 쓰기 타임아웃 설정COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout = 0;timeouts.ReadTotalTimeoutMultiplier = 0;timeouts.ReadTotalTimeoutConstant = 0;timeouts.WriteTotalTimeoutMultiplier = 0;timeouts.WriteTotalTimeoutConstant = 0;if(!SetCommTimeouts(hComm, &timeouts)) err_quit("SetCommTimeouts()");

Page 14: Chapter  12. 직렬 통신과 무선 프로토콜

- 14 -

직렬 통신 함수 (8/9)

• 데이터 읽기와 쓰기

BOOL ReadFile ( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) ; 성공 : 0 이 아닌 값 , 실패 : 0

Page 15: Chapter  12. 직렬 통신과 무선 프로토콜

- 15 -

직렬 통신 함수 (9/9)

• 데이터 읽기와 쓰기 (cont’d)

BOOL WriteFile ( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) ; 성공 : 0 이 아닌 값 , 실패 : 0

Page 16: Chapter  12. 직렬 통신과 무선 프로토콜

- 16 -

IrDA (1/3)

• IrDA– 노트북 , PDA, 휴대폰 등에 장착된 적외선 통신 하드웨어– 적외선을 이용한 무선 통신 프로토콜 집합– IrDA 기술 개발과 표준화를 담당하는 기관 (http://www.ir

da.org)

Page 17: Chapter  12. 직렬 통신과 무선 프로토콜

- 17 -

IrDA (2/3)

• 특징① 지향성 (30° 이내 각도 ) 을 가지며 , 단거리 (~1m) 에서 ,

점대점 (point-to-point) 방식으로 동작하는 무선 통신 프로토콜이다 .

② IrDA 하드웨어에 따라 다양한 전송 속도 (115kps ~ 16Mbps) 를 지원하며 , 통신 에러율이 매우 낮다 .

③ 통신을 위한 다양한 파라미터가 자동으로 설정되므로 (no configuration), 편리하게 사용할 수 있다 .

④ 하드웨어의 소형화 , 저전력화 , 저가격화가 가능하다 .

Page 18: Chapter  12. 직렬 통신과 무선 프로토콜

- 18 -

IrDA (3/3)

• 윈도우 운영체제별 IrDA 프로그래밍 지원 사항

운영체제 지원 사항

CE IrCOMM, IrSock

95, NT 4.0 없음

98, Me IrCOMM, IrSock

2000 IrSock

XP/2003 IrSock

Page 19: Chapter  12. 직렬 통신과 무선 프로토콜

- 19 -

IrDA 소켓 프로그래밍 (1/7)

• IrDA 소켓 프로그래밍① IrDA 를 위한 헤더 파일을 추가한다 .② IrDA 를 위한 소켓을 생성한다 .③ 소켓 주소 구조체로 SOCKADDR_IN 대신 SOCKADDR_I

RDA 를 사용한다 .④ 통신 대상이 고정되어 있지 않으므로 , 연결하기 전에 Ir

DA 장치를 탐색한다 .

Page 20: Chapter  12. 직렬 통신과 무선 프로토콜

- 20 -

IrDA 소켓 프로그래밍 (2/7)

• 헤더 파일과 매크로

• 소켓 생성

#define _WIN32_WINDOWS 0x0410 // 윈도우 98 이상#define _WIN32_WINNT 0x0500 // 윈도우 2000 이상

#include <winsock2.h>#include <af_irda.h>...

// socket()SOCKET sock = socket(AF_IRDA, SOCK_STREAM, 0);if(sock == INVALID_SOCKET) err_quit("socket()");

Page 21: Chapter  12. 직렬 통신과 무선 프로토콜

- 21 -

IrDA 소켓 프로그래밍 (3/7)

• 소켓 주소 구조체

typedef struct _SOCKADDR_IRDA{ u_short irdaAddressFamily; u_char irdaDeviceID[4]; char irdaServiceName[25];} SOCKADDR_IRDA;

Page 22: Chapter  12. 직렬 통신과 무선 프로토콜

- 22 -

IrDA 소켓 프로그래밍 (4/7)

• 소켓 주소 구조체 사용 예 – 서버 코드

// bind()SOCKADDR_IRDA serveraddr;ZeroMemory(&serveraddr, sizeof(serveraddr));serveraddr.irdaAddressFamily = AF_IRDA;strcpy(serveraddr.irdaServiceName, "IrServer");retval = bind(listen_sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));if(retval == SOCKET_ERROR) err_quit("bind()");

Page 23: Chapter  12. 직렬 통신과 무선 프로토콜

- 23 -

IrDA 소켓 프로그래밍 (5/7)

• 소켓 주소 구조체 사용 예 – 클라이언트 코드

// 장치 탐색...

// connect()SOCKADDR_IRDA serveraddr;ZeroMemory(&serveraddr, sizeof(serveraddr));serveraddr.irdaAddressFamily = AF_IRDA;serveraddr.irdaDeviceID[] 채우기 ;strcpy(serveraddr.irdaServiceName, "IrServer");retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));if(retval == SOCKET_ERROR) err_quit("connect()");

Page 24: Chapter  12. 직렬 통신과 무선 프로토콜

- 24 -

IrDA 소켓 프로그래밍 (6/7)

• IrDA 장치 탐색

// 최대 10 개의 IrDA 장치 탐색struct MyDevList{ ULONG numDevice; // IrDA 장치 개수 IRDA_DEVICE_INFO Device[10]; // IrDA 장치 정보} optval;optval.numDevice = 0; // IrDA 장치 개수를 0 으로 초기화int optlen = sizeof(optval);retval = getsockopt(sock, SOL_IRLMP, IRLMP_ENUMDEVICES, (char *)&optval, &optlen);if(retval == SOCKET_ERROR) err_quit("getsockopt");

// 장치 탐색 결과 출력printf("[IrDA 클라이언트 ] %d 개의 적외선 장치 발견 !\n", optval.numDevice);if(optval.numDevice == 0){ closesocket(sock); WSACleanup(); return 0;}

Page 25: Chapter  12. 직렬 통신과 무선 프로토콜

- 25 -

IrDA 소켓 프로그래밍 (7/7)

• IrDA 장치 탐색 (cont’d)

// 발견한 IrDA 장치 목록을 화면에 표시하고 이 중 하나를 // 사용자가 선택하도록 할 수 있다 .// 여기서는 무조건 첫 번째 IrDA 장치에 접속하도록 하였다 .SOCKADDR_IRDA serveraddr;ZeroMemory(&serveraddr, sizeof(serveraddr));serveraddr.irdaAddressFamily = AF_IRDA;memcpy(&serveraddr.irdaDeviceID[0], &optval.Device[0].irdaDeviceID[0], 4);strcpy(serveraddr.irdaServiceName, "IrServer");retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));if(retval == SOCKET_ERROR) err_quit("connect()");

Page 26: Chapter  12. 직렬 통신과 무선 프로토콜

- 26 -

블루투스 (1/5)

• 특징① 전 지구상에서 사용 가능한 2.4GHz 주파수 대를

사용한다 ( 지역에 따라 사용할 수 있는 주파수 영역에는 약간 차이가 있다 .).

② IrDA 와 달리 무지향성이며 , 단거리 (10m~100m) 에서 , 점대점 (point-to-point) 또는 점대다점 (multi-point) 방식으로 동작하는 무선 통신 프로토콜이다 .

③ 데이터와 세 개의 음성 채널을 지원한다 . 데이터 전송률은 1Mbps 다 .

④ 하드웨어의 소형화 , 저전력화 , 저가격화가 가능하다 .

Page 27: Chapter  12. 직렬 통신과 무선 프로토콜

- 27 -

블루투스 (2/5)

• 블루투스 기술 스펙– 코어 (core) 스펙

• 블루투스 기술이 어떻게 작동하는지를 보여주기 위한 부분으로 물리적인 부분과 그에 필요한 펌웨어 (firmware) 등 하드웨어적인 설계 사양에 대해 기술

– 프로파일 (profile) 스펙• 기기 상호간의 호환성 (interoperability) 을 위해 마련된 것으로

각각의 응용에 대한 프로토콜 배열에 대한 정의

Page 28: Chapter  12. 직렬 통신과 무선 프로토콜

- 28 -

블루투스 (3/5)

• 주요 프로파일– 모든 블루투스 기기가 탑재할 프로파일

• Generic access: 블루투스 장치 탐색과 연결 관리를 위한 일반적인 절차

• Service discovery: 블루투스 애플리케이션이 다른 블루투스 장치의 서비스를 탐색하기 위한 절차

– 전화 기능을 위한 프로파일• Cordless telephone: 무선 전화기 (3-in-1 phone)• Intercom: 무선 전화기 (3-in-1 phone)• Synchronization: 동기화

Page 29: Chapter  12. 직렬 통신과 무선 프로토콜

- 29 -

블루투스 (4/5)

• 주요 프로파일 (cont’d)– 직렬 포트를 장착한 기기 접속에 필요한 프로파일

• Serial port: 직렬 포트를 사용한 애플리케이션을 위한 직렬 케이블 에뮬레이션

• Headset: 무선 헤드셋• Dial-up networking: 모뎀 등 • FAX: FAX • LAN access: 라우터

– 객체 (object) 교환이나 파일 전송을 위한 프로파일• Generic object exchange: 객체 교환을 위한 요구 사항• Object push: 명함 교환 등• File transfer: 파일 전송

Page 30: Chapter  12. 직렬 통신과 무선 프로토콜

- 30 -

블루투스 (5/5)

• 주요 프로파일 - 예

Page 31: Chapter  12. 직렬 통신과 무선 프로토콜

- 31 -

블루투스 프로그래밍

• 구성 요소– 블루투스 하드웨어 + 장치 드라이버– 블루투스 프로토콜 스택– 블루투스 개발 소프트웨어

• 개발 방법– 상용 개발 소프트웨어– 소켓 프로그래밍

• 마이크로소프트 블루투스 프로토콜 스택• 마이크로소프트 블루투스 프로토콜 스택과 호환되는 블루투스

하드웨어 + 장치 드라이버• 헤더 파일과 라이브러리

– 직렬 통신 프로그래밍