본문 바로가기

잡다한이야기

VS2008 MFC 를 이용한 시리얼 통신 프로그램 만들기(5)

반응형

지난 시간에 이어 CMycomm 클래스를 다이얼로그 에서 사용 하는 과정을 알아 보겠습니다.


1. 클래스 사용 준비

- CMycomm 클래스의 객체 포인터를 맴버 변수로 선언하고, 스레드가 종료될 때 발생하는 메시지를 처리할 콜백 함수와

스레드에서 데이터가 수신되었음을 알리는 메시지를 처리하는 콜백함수 이렇게 두개를 먼저 선언 합니다.

물론 선언 위치는 serialDlg.h 파일이며, 정화기 CserialDlg 클래스의 맴버로 선언 해야 합니다.

 

// serialDlg.h : header file

//

#pragma once

#include "afxwin.h"

#include "Mycomm.h"

// CserialDlg dialog

class CserialDlg : public CDialog

{

// Construction

public:

CMycomm* m_comm;

LRESULT OnThreadClosed(WPARAM length, LPARAM lpara);

LRESULT OnReceive(WPARAM length, LPARAM lpara);

CserialDlg(CWnd* pParent = NULL); // standard constructor

-> 붉은색 글씨 부분 추가

 

 

- 그다음 수신 데이터 발생시 전달되는 메시지와 스레드 종료 메시지를 처리하기 위해 메시지 맵에서 매핑 시켜 줘야 합니다.

 

BEGIN_MESSAGE_MAP(CserialDlg, CDialog)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_MESSAGE(WM_MYCLOSE, &CserialDlg::OnThreadClosed)

ON_MESSAGE(WM_MYRECEIVE,&CserialDlg::OnReceive)

ON_BN_CLICKED(IDC_BT_CONNECT, &CserialDlg::OnBnClickedBtConnect)

ON_BN_CLICKED(IDC_BT_CLEAR, &CserialDlg::OnBnClickedBtClear)

ON_CBN_SELCHANGE(IDC_COMBO_COMPORT, &CserialDlg::OnCbnSelchangeComboComport)

ON_CBN_SELCHANGE(IDC_COMBO_BAUDRATE, &CserialDlg::OnCbnSelchangeComboBaudrate)

END_MESSAGE_MAP()

-> BEGIN_MESSAGE_MAP 은 발생된 메시지를 메시지 처리 함수와 연결 시켜주는 역할을 합니다.

 


- 이제 연결되어 처리될 함수를 구현해 넣으면 됩니다.

 

LRESULT CserialDlg::OnThreadClosed(WPARAM length, LPARAM lpara)

{

//overlapped i/o 핸들을닫는다.

((CMycomm*)lpara)->HandleClose();

delete ((CMycomm*)lpara);

return 0;

}

LRESULT CserialDlg::OnReceive(WPARAM length, LPARAM lpara)

{

CString str;

char data[20000];

if(m_comm)

{

m_comm->Receive(data,length); //length 길이만큼데이터를받는다.

data[length]=_T('\0');

str+=_T("\r\n");

for(int i = 0;i<length;i++)

{

str += data[i];

}

m_edit_rcv_view.ReplaceSel(str); //에디트박스에표시하기위함

str = "";

//UpdateData(FALSE);

m_edit_rcv_view.LineScroll(m_edit_rcv_view.GetLineCount());

}

return 0;

}

->OnThreadClosed : COM 포트를 닫는다고 해서 완전히 종료 된것은 아니고 overlapped I/O 핸들도 종료를 해야 하는데요

그걸 스레드 종료 할 때 하도록 하는 것입니다.

 

-> OnReceive :데이터 수신메시지가 발생되면 스레드에서 저장해 놓은 버퍼에서 읽어와 다이얼로그 가운데 큰 EDIT BOX

에 추가 하는 기능윽 합니다.

-> 여기서 한가지 추가 하면 m_edit_rcv_view.LineScroll(m_edit_rcv_view.GetLineCount()); 은 edit box의

화면이 넘어가면 우측 스크롤을 맨 아래로 내려 주는 역알을 합니다. 알면 쉽고 모르면 짜증나는 녀석이죠.


여기 까지 해서 UI 뒤에서 도는 코드들은 완성이 되었습니다.

이제 남은 것은 다이얼로그에 배치된 각 컨트롤들에 이벤트를 부여 하는 것이죠, 예를 들어 OPEN 버튼을 누르면 무슨일을 하고,

CLOSE 버튼을 누르면 어떤 일을 해야 하는지를 만드는 것이지요.

다음 시간에 계속 하겠습니다.

 

 

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=lecture_tip&search_target=user_name&search_keyword=%EC%84%A0%EC%84%B1%ED%83%9C&page=4&document_srl=572588

 

원보은 여기에 있습니다.

 

반응형