1) 연결 케이블 준비
USB1.1 to 시리얼 변환기 2개 (usb1.1, usb2.0 상관없음)
USB1.1은 low speed 모드로 1.5Mbps, full speed 모드로 12Mbps를 지원한다.
USB2.0은 low speed 모드와 full speed 모드를 지원하면서, 40배 빠른 최대 480Mbps를 지원하는 high speed 모드가 제공된다.
드라이버
PL2303 Windows User Manual v1.6.0.pdf
PL2303_DriverInstallerv1.6.0_ReleaseNote.txt
PL2303_Prolific_DriverInstaller_v1.6.0.exe
PL2303CheckChipVersion.exe

시리얼 크로스 케이블 (3M/5M) - 1개
양쪽 컨텍터가 암컷으로 동일하며, 2번과 3번이 서로 교차하여 연결되어 있다.

2) 시리얼 통신 프로그램을 작성
Comm.cpp
Comm.h
RS232통신.pdf
모드버스.pdf
완성소스:
rs232comm.zip
1) Comm.cpp 소스 설명
(1) 데이터 받기------
OpenComPort() 에서 com을 연결하기
hCom = CreateFile(...)
SetCommState(hCom,&dcb) // 컴포트 구성값들 설정하기
AfxBeginThread((AFX_THREADPROC)CommWatchProc,(LPVOID)this)) // CommWatchProc() 함수를 스레드로 돌리기
CommWatchProc() 데이터 받기
while(..)
{
WaitCommEvent(...) // 데이터가 들어올때까지 대기
dwLength = npCom->SetReadData(); // 데이터 가져오기 ReadFile(...) 함수로 com 포트로부터 데이터 읽기
SendMessage(npCom->m_hwnd, WM_RECEIVEDATA, dwTotLen, 0); // 데이터 받기 메세지 전송
}
(2) 데이터 쓰기 -----
WriteCommBlock(...) 함수로 데이터 전송하기
-> WriteFile(...) 함수로 Com 포트로 데이터 쓰기

2) 시리얼통신 프로그램 작성법:
먼저 CSerialComDlg라고 다이얼로그 베이스의 MFC 프로젝트를 생성한다. 그 다음에 각각 파일에 다음과 같이 추가한다.
(1) CSerialComDlg.h 소스에 다음을 추가한다.
#include "comm.h"
CCom m_Comm;
// 콤보박스와 에디트콘트롤 변수 추가
CString m_BaudRate; // IDC_BAUDRATE 속도 콤보박스
CString m_Port; // IDC_PORT 포트 콤보박스
CString m_EditData; // IDC_RECIEVEDATA, 입력받은 데이터를 출력하는 부분 (에디티콘트롤)
// 버튼 클릭시 함수 추가
afx_msg void OnConnect();
afx_msg void OnSend();
// WM_RECEIVEDATA 메세지 발생시 (수동으로 작성)
LONG OnReceiveData(UINT, LONG); // 수신데이터 처리함수
(2) CSerialComDlg.cpp 소스에 다음을 추가한다.
// (1) 메세지맵에 추가한다.
BEGIN_MESSAGE_MAP(CSerialDlg, CDialog)
...
ON_MESSAGE(WM_RECEIVEDATA, OnReceiveData)
END_MESSAGE_MAP()
// (2) 연결버튼
void CSerialComDlg::OnConnect()
{
UpdateData(TRUE);
m_Comm.SetComPort( "COM1", 9600,8,0,0);
if(m_Comm.OpenComPort()==TRUE)
{
AfxMessageBox("Connected !!");
}
else
{
AfxMessageBox("Not connected !!");
m_Comm.CloseConnection();
}
}
// (3) Comm 핸들 초기화
BOOL CSerialComDlg::OnInitDialog()
{
....
m_Comm.SetHwnd(this->m_hWnd);
}
// (4) 데이터 받는 함수
LONG CSerialComDlg::OnReceiveData(UINT WParam,LONG a)
{
int nLen = WParam; // 수신된 데이터 길이
CString str;
BYTE ch;
UpdateData(TRUE);
for(int i=0;i<nLen;i++)
{
ch = (int)m_Comm.ReceiveData[i];
str.Format("%c", ch);
m_RsvData += str; // 다이얼로그에 EditCtrl을 추가하고 CString m_RsvData 변수를 추가한다.
}
UpdateData(FALSE);
return TRUE;
}
// (5) 전송 버튼 클릭시
void CSerialComDlg::OnSend()
{
char data[]= "hello!";
// char data2[] = { 0x01, 0x02, 0x14, 0x0ff, 0x03 };
m_Comm.WriteCommBlock(data, sizeof(data)); // sizeof()는 전송할 데이터 개수
}
3) 통신 프로그램 구현
- 두 대의 컴퓨터에서 통신 프로그램을 동작시킨다.
- 송신과 수신이 가능하게 한다.
- 설정모드: Port/ Baud rate, Data bits/ Parity bits/ Stop bits/
- 체크박스 선택시 한 쪽에서 마우스를 움직이면 다른 한쪽에서 마우스가 그대로 움직인다. (버튼클릭, 마우스이동 등)
- 데이터 전송 버튼을 누르면 상대편 창에서 그래프가 그려진다.

4) 마우스 리모트 컨트롤
내 컴퓨터의 마우스를 움직이면 상대방 컴퓨터의 마우스가 따라 움직인다.
(1) 1번 컴퓨터
마우스 움직임 좌표 얻기 : WM_MOUSEMOVE
얻은 마우스 좌표를 Send() 한다. "X:100 Y:200"
(2) 2번 컴퓨터
Receive() 함수에서 읽은 마우스 좌표를 분석한다. "X:100 Y:200"
sscanf()등의 함수를 통해 100과 200 값을 읽어 온다.
마우스를 이동시킨다. SetCurPos(x,y)함수
참고소스
LONG CSerial2Dlg::OnReceiveData(UINT WParam,LONG a)
{
int nLen = WParam; // 수신된 데이터 길이
CString str;
BYTE ch;
UpdateData(TRUE);
CString msg;
int x,y;
for(int i=0;i<nLen;i++)
{
ch = (int)m_Comm.ReceiveData[i];
str.Format("%c", ch);
m_RsvData+=str;
if(ch=='\n') {
sscanf(msg, "X:%d Y:%d", &x,&y);
SetCursorPos(x,y);
msg = "";
}
else msg += str;
}
m_RsvData+="\r\n";
UpdateData(FALSE);
return TRUE;
}
void CSerial2Dlg::xxxxxxxxOnMouseMove(UINT nFlags, CPoint point)
{
CString msg;
msg.Format("X:%d Y:%d\n",point.x, point.y);
m_Comm.WriteCommBlock(msg, msg.GetLength());
CDialog::xxxxxxxxOnMouseMove(nFlags, point);
}