윈도우 기반 직렬통신
윈도우 기반 직렬 통신을 위해 먼저 Virtual Serial Port Driver 프로그램을 설치했다. 크로스 연결된 2개의 가상 포트를 생성할 수 있다.
설정이 끝나고 장치관리자를 보면 위와 같이 뜬다.
직렬 통신 절차
송신 프로그램
수신 프로그램
// COM2, COM3는 가상 포트로 두 포트는 연결되어 있는 상태이다.
// 송신 프로그램에서 전송할 문자를 입력한 뒤 엔터를 치면 데이터를 전송한다.
// -1를 입력하면 송신 프로그램 수신 프로그램 모두 종료 된다.
윈도우 기반 직렬 통신을 위해 먼저 Virtual Serial Port Driver 프로그램을 설치했다. 크로스 연결된 2개의 가상 포트를 생성할 수 있다.
설정이 끝나고 장치관리자를 보면 위와 같이 뜬다.
직렬 통신 절차
송신 프로그램
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
int main(void)
{
char szPort[15];
wsprintf(szPort, "COM%d", 2);
HANDLE m_hComm = NULL;
m_hComm = CreateFile(szPort,
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL); // 통신 포트 열기
if(m_hComm == INVALID_HANDLE_VALUE)
{
printf("(!) Failed to create a Comm Device file");
return FALSE;
}
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb); // 기본 통신 상태 읽기
// 통신 속도 상태 설정
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 0;
SetCommState(m_hComm, &dcb);
// 통신 이벤트 객체 생성
OVERLAPPED osWrite;
osWrite.Offset = 0;
osWrite.OffsetHigh = 0;
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
char buf[100] = "Hello world \r\n";
while(1)
{
cout << "Input : ";
cin >> buf;
printf("send:%s\n", buf);
WriteFile(m_hComm, buf, strlen(buf), NULL, &osWrite); // 데이터 전송
if((buf[0] == '-') && (buf[1] == '1'))
break;
//Sleep(1000);
}
CloseHandle(m_hComm);
return 0;
}
수신 프로그램
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
char szPort[15];
wsprintf(szPort, "COM%d", 3);
HANDLE m_hComm = NULL;
m_hComm = CreateFile(szPort,
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL); // 통신 포트 열기
if(m_hComm == INVALID_HANDLE_VALUE)
{
printf("(!) Failed to create a Comm Device file");
return FALSE;
}
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb); // 기본 통신 설정 상태 읽기
// 통신 속도 상태 설정
dcb.BaudRate = 9600;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 0;
SetCommState(m_hComm, &dcb);
// 통신 이벤트 객체 생성
OVERLAPPED osRead;
osRead.Offset = 0;
osRead.OffsetHigh = 0;
osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD size;
char buf[100];
while(1)
{
ReadFile(m_hComm, buf, 100, &size, &osRead); // 데이터 수신
buf[size] = '\0';
printf("recv:%s\n", buf);
if((buf[0] == '-') && (buf[1] == '1'))
break;
}
CloseHandle(m_hComm);
return 0;
}
// 송신 프로그램에서 전송할 문자를 입력한 뒤 엔터를 치면 데이터를 전송한다.
// -1를 입력하면 송신 프로그램 수신 프로그램 모두 종료 된다.