CAFE

캡스톤디자인18(SCEA)

SCS-PBL: 시리얼 통신 프로그램 작성

작성자한창호|작성시간15.09.14|조회수2,467 목록 댓글 0

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);
}

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼