[VC++] 시리얼 통신 프로그램 만들기[2-5] – 시리얼 수신을 화면에 표시 및 키입력 전송하기

시리얼 클래스에서 시리얼 포트를 감시하다 반응이 오면 이를 처리할 윈도우로 윈도우메세지를 보내주게 됩니다.
우리가 앞서 선언하고 정의한 이 메세지의 핸들러 함수인 CMainFrame::OnSerialMsg 에서 수신받은 데이터를 화면에 표시해주면 됩니다.

CMainFrame 의 OnSerialMsg 함수의 if 안에 다음과 같은 내용을 기입해줍니다.


	if (eEvent & CSerial::EEventRecv)
	{
		// Create a clean buffer
		DWORD dwRead;
		CString szString;
		CEdit& editView
			= ((CEditView*)GetActiveView())->GetEditCtrl();
		char szData[101];
		const int nBuflen = sizeof(szData)-1;

		// Obtain the data from the serial port
		do
		{
			m_Serial.Read(szData,nBuflen,&dwRead);
			szData[dwRead] = '\0';

			for (DWORD dwChar=0; dwChar<dwRead; dwChar++)
			{
				szString += szData[dwChar];
				if(szData[dwChar] == '\r')
					szString += '\n';
			}

			editView.SetSel(-1, 0);	// 끝으로 이동
			editView.ReplaceSel(szString); // 문자열 추가
		} while (dwRead == nBuflen);
	}
	return 0;

위 루틴은 시리얼 포트에서 데이터가 수신될 때 CSerial::Read 함수를 버퍼를 넘겨주고 호출하여 최근 수신된 데이터들을 받아와서 CEditView 클래스로 부터 상속받은 CComConstructorView 클래스에 텍스트(수신된 데이터)를 추가하는 역할을 합니다.
CEditView 에서의 개행을 위해 ‘r’ 문자가 들어오면 ‘n’ 을 더해서 “rn” 이 되도록 문자열을 조작한후 뷰클래스로 넘깁니다.

컴파일하고 프로그램을 실행시킨 후 메뉴의 접속을 클릭하면 이제 COM1 으로 부터 전송되어지는 데이터가 화면에 표시될 것입니다.

이제 키보드로부터 받은 키입력 데이터를 시리얼로 전송시키기 위해 Work Space 의 ClassView 탭에서 CComConstructorView 클래스에 마우스 커서를 위치시키고 오른쪽마우스 클릭으로 팝업메뉴를 불러 “Add Window Message Handler” 메뉴를 선택하여 아래그림과 같이 WM_CHAR 메세지에 대한 메세지 핸들러 함수를 추가해줍니다.

ComConstructor_OnChar

 

이렇게 추가된 CComConstructorView 의 OnChar 함수에 다음과 같은 내용을 기입합니다.


void CComConstructorView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	CMainFrame* pMainFrame
		= (CMainFrame*)AfxGetMainWnd();
	CEdit& editView = GetEditCtrl();
	char szChar[4];
	char *pChar;
	pChar = szChar;

	// Send the data through the serial connection (if it's open)
	if (pMainFrame->m_Serial.IsOpen())
	{
		char ch = static_cast<char>(nChar);
		pMainFrame->m_Serial.Write(&ch,1);
		*pChar++ = ch;
		if(ch == '\r')
			*pChar++ ='\n';
		*pChar++ = 0x00;
		editView.SetSel(-1, 0);
		editView.ReplaceSel(szChar);
	}
}

 

윈도우 메세지 WM_CHAR 는 키보드로부터 키입력이 들어올때 발생되며 우리는 이에대한 처리를 위해 이 메세지의 핸들러 함수인 OnChar 를 만들었으며 CEditView 에 시리얼 포트로 수신된 데이터를 출력해주는 역할을 합니다.
그리고 우리는 뷰 화면에 키보드로 입력을 할 것이므로 이에대한 처리를 뷰 클래스에 만들었습니다.

 

CMainFrame 클래스 내용을 참조할 수 있도록 ComConstructorView.cpp 의 상단에

#include “MainFrm.h”

위 구문을 추가시켜 줍니다.

이제 컴파일 하고 실행시킨 후 시리얼 접속을 시킨 후 화면에 키입력을 하면 시리얼 포트를 통해 전송될 것이고 데이터가 시리얼 포트로 수신된다면 마찬가지로 화면에 표시될 것입니다.

 

이 글을 공유하기:

Be the first to comment

Leave a Reply