학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

온도제어(싱글다큐먼트)

학습목표

싱글다큐먼트로 온도제어 통신프로그램을 만든다.

학습주제

송신과 수신 신호의 처리

통신속도

예습내용

통신 인터럽트, 통신버퍼

실습방법

프로그램에서 다음을 추가 한다. 높은온도(TempHigh)와 낮은온도(TempLow) 사이를 256 단계로 글자의 바탕색이 변하게 프로그램 했다.

#include "stdafx.h"

#include "SRs232.h"

 

#include "SRs232Doc.h"

#include "SRs232View.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

extern HWND hCommWnd;            // (3)

char buff[2048]="";     // (8) 수신된글자를저장한다.

int iText=0;    // (9) buff에저장되는순서의변수

double dTemp;   // 전송된온도값을저장한다.

//=============  생략  ==============================

void CSRs232View::OnInitialUpdate()

{

        CView::OnInitialUpdate();

 

        // TODO: 여기에특수화된코드를추가및/또는기본클래스를호출합니다.

        m_ComuPort.OpenPort( "COM1", 9600, 1 );  // (5) 통신포트를연다.

        SetTimer(1,500,NULL);

}

 

void CSRs232View::OnTimer(UINT_PTR nIDEvent)

{

        // TODO: 여기에메시지처리기코드를추가및/또는기본값을호출합니다.

        CString strTemp;

        strTemp.Format("%c01DRS,02,0001%c%c",0x02,0x0D,0x0A);

        strTemp.MakeUpper();

        m_ComuPort.WriteComm((unsigned char*)(LPCTSTR)strTemp,strTemp.GetLength());

        CView::OnTimer(nIDEvent);

}

 

void CSRs232View::OnPaint()

{

        CPaintDC dc(this); // device context for painting

        // TODO: 여기에메시지처리기코드를추가합니다.

        // 그리기메시지에대해서는CView::OnPaint()() 호출하지마십시오.

        hCommWnd= m_hWnd; // (6)

 

        //아래3줄이면기본온도값을출력

        CString strTemp;

        strTemp.Format("현재온도는%5.1f",dTemp);

        dc.TextOut(10, 10, strTemp);

        //=========================

 

        //온도에따라색이변하게만듬

        CRect rectLeft  = CRect(50, 50, 650, 150);

        //dc.FillSolidRect(&rectLeft, RGB(192, 0, 0));   // 기본출력

        int TempHigh=34,TempLow=30;

        int iColor=256*(dTemp-TempLow)/(TempHigh-TempLow);

        dc.FillSolidRect(&rectLeft, RGB(iColor, 0, 256-iColor));

 

        //앞서만든사각형을영역으로만든다.

        CRgn rgnLeft, rgnRight;

        rgnLeft.CreateRectRgnIndirect(rectLeft);

 

        //DC의폰트를Arial Black(높이72)으로바꾼다.

        LOGFONT lf;

        ::ZeroMemory(&lf, sizeof(lf));

        lf.lfHeight = 72;

        wsprintf(lf.lfFaceName, _T("%s"), _T("Arial Black"));

        CFont NewFont;

        NewFont.CreateFontIndirect(&lf);

        CFont* pOldFont = dc.SelectObject(&NewFont);

 

        dc.SetBkMode(TRANSPARENT);

 

        //왼쪽영역을선택하여문자열을출력한다.

        dc.SetTextColor(RGB(192, 192, 192));

        dc.SelectClipRgn(&rgnLeft);

        dc.TextOut(60, 65, strTemp);

 

        dc.SelectObject(pOldFont);

}

 

LONG CSRs232View::OnCommunication(UINT port, LONG lParam)  // (7)

{

        BYTE aByte=0x00;

        int size= (m_ComuPort.m_QueueRead).GetSize();

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

        {

                (m_ComuPort.m_QueueRead).GetByte(&aByte);

                if(aByte==0x02) iText=0; // 통신시작을나타낸다.

                if( aByte!= NULL ) buff[iText++]= aByte;

                else { iText--; size--; }

        }

 

        if(aByte==0x0A) {// 통신끝을나타낸다.

                if(buff[3]=='D' && buff[4]=='R' && buff[5]=='S' && buff[7]=='O' && buff[8]=='K') {

                        dTemp=StringToDouble(&buff[10])/10.;

                        RedrawWindow();

                }

        }

 

        return 0;

}

 

double CSRs232View::StringToDouble(char *in)

{

        return (double)(CharToInt(in[0])*16*16*16+CharToInt(in[1])*16*16

                        +CharToInt(in[2])*16+CharToInt(in[3]));

}

 

int CSRs232View::CharToInt(char in)

{

        if(in < 0x41)

                return (int(in)-48);

        else if(in < 0x61)

                return (int(in)-55);

        else

                return (int(in)-87);

}

 

 

 

 

 arrow01c처음