Visual C++ 6.0에서 Timer 사용하기

 

1. Timer가 뭐야?

    - 간단히 말해서, 셋팅한 타임마다 실행하는 함수. 예를들어 5초로 셋팅해놓으면 5초마다 Timer함수가 호출됨.

 

2. Timer 이벤트 함수 만들기

    1) ClassWizard로 들어가자.

   

    2) Messages에 WM_TIMER를 선택하고 Add Function을 클릭해.

 

    3) 그럼 OnTimer(UINT nIDEvent)라는 함수가 생길거야.

        이 함수안에 셋팅한 시간마다 할 일을 작성하면 되는거야. 그럼 셋팅은 어떻게 하느냐?

 

3. Timer 셋팅하기   

    - 이 한줄만 있으면 Timer셋팅은 끝.

       첫번째 인자는 타이머번호야. 타이머를 여러개 쓸때 구분하기위한 것이니 겹치지 않게 하도록...

       두번째 인자는 타이머함수를 호출하는 주기야. 시간단위는 1000분의 1초. 예를들어 1000은 1초, 2000은 2초....

       세번째 인자는 그냥 NULL로 두자. 깊이있게 가지마...

    - 이렇게 SetTimer를 선언하면 이때부터 셋팅된 시간마다 함수가 호출될거야. 그럼 멈추는건 어떻게 하느냐?

 

4. Timer 멈추기 

    - KillTimer 한줄이면 Timer는 멈춰. 무섭게도 죽여버리는거지.

 

 

Posted by 둔한늑대
,

Visual C++ 6.0에서 현재시간 가져오는 방법

 

  - Ctrl+C / Ctrl+V 용 소스

     CString LogWriteString;

     CTime cTime = CTime::GetCurrentTime(); 
      LogWriteString.Format("%04d/%02d/%02d %02d:%02d:%02d", cTime.GetYear(), cTime.GetMonth(),  

                                        cTime.GetDay(), cTime.GetHour(), cTime.GetMinute(), cTime.GetSecond());   

 

  - 설명이 필요없는 코드지만, 그래도 적어두자.

      cTime.GetYear()     : 현재시간의 년(年)을 가지고 있음.

      cTime.GetMonth()   : 현재시간의 월(月)을 가지고 있음.

      cTime.GetDay()      : 현재시간의 일(日)을 가지고 있음.

      cTime.GetHour()     : 현재시간의 시(時)를 가지고 있음.

      cTime.GetMinute()  : 현재시간의 분(分)을 가지고 있음.

      cTime.GetSecond() : 현재시간의 초(秒)를 가지고 있음.

 

 

    

 

 

Posted by 둔한늑대
,

Visual C++ 6.0에서 COM포트 오픈하기

 

1. 아래 소스대로 Ctrl+C/Ctrl+V 하면 COM포트는 활짝 열린다.

 

 DCB    dcb = {sizeof(DCB)};

 CString ComPortName;
 ComPortName.Format(_T("COM%d"),ComPortNum+3);
 HANDLE m_hComm;

 m_hComm = CreateFile(ComPortName,
  GENERIC_READ | GENERIC_WRITE,             // 접근모드 읽기쓰기인가 읽기 전용인가
  0 ,                                                           // 다른 프로그램과 공유를 할것인가 아닌가.
  NULL,                                                       // 보안에 관한 속성
  OPEN_EXISTING,                                        // 어떻게 열것인가

  0,                                                             // 파일 속성(보통 파일이면서 overlapped 되게 한다.)
  NULL);                                                      // 템플릿 파일 핸들러
 
 if (m_hComm == (HANDLE) -1)
 {
  AfxMessageBox("Com Port Connect Fail!");
  return;
 }
 
 // EV_RXCHAR event 설정
 SetCommMask(m_hComm, EV_BREAK | EV_ERR | EV_RXCHAR | EV_TXEMPTY); 


 // InQueue, OutQueue 크기 설정.
 SetupComm(m_hComm, 4096, 4096); 


 // 포트 비우기.
 PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
 
 // dcb 설정
 dcb.DCBlength = sizeof(DCB);
 GetCommState(m_hComm, &dcb); // 예전 값을 읽음.
 dcb.BaudRate = CBR_115200;      //BaudRate 비트/초
 dcb.ByteSize = 8;               //데이터비트
 dcb.Parity = NOPARITY;          // 패리티
 dcb.StopBits = ONESTOPBIT;      // 정지비트

 dcb.fParity = FALSE;
 dcb.fNull = FALSE;

 if (! SetCommState(m_hComm, &dcb))
 {
      AfxMessageBox("Com Port Connect Setting Fail!");
      //ClosePort();
      return;
 }

 

 COMMTIMEOUTS timeouts;
 timeouts.ReadIntervalTimeout = 0;
 timeouts.ReadTotalTimeoutMultiplier = 0;
 timeouts.ReadTotalTimeoutConstant = 0;
 timeouts.WriteTotalTimeoutMultiplier = 0;
 timeouts.WriteTotalTimeoutConstant = 0;
 if (!SetCommTimeouts(m_hComm, &timeouts))
      return;

 

2. 하나씩 뜯어보자. 물론 내가 아는거만 적는다.

     1) CreateFile() - COM포트 열기

           - 1번째 인자 : 연결할 COM포트 정하기.

                               여기서는 ComPortName 문자열에 들어간 값의 포트가 열린다. ex) COM3, COM4, COM5.....

           - 2번째 인자 : 포트의 엑서스 권한을 정하기.

                                GENERIC_READ | GENERIC_WRITE => 읽기, 쓰기 권한을 가진다. 나머지 옵션은 검색~

           - 3번째 인자 : 공유모드 정하기. 다른 프로세스에서 접근할 수 있게 할지 정하기.

                                FILE_SHARE_READ | FILE_SHARE_WRITE => 다른프로세스의 읽기, 쓰기 권한을 가진다.

           - 4번째 인자 : 보안에 관한 속성. 잘 모른다. 그냥 NULL로 정하자.

           - 5번째 인자 : COM포트를 어떻게 열것인가? 하나만 지정할 수 있다.

                                OPEN_ALWAYS => 항상 새로 연다. 역시나 나머지는 옵션은 검색~

           - 6번째 인자 : COM포트의 속성을 지정한다고 하지만, 무슨말인지 모른다.

                               FILE_FLAG_OVERLAPPED로 정하고 쓰자. 검색해도 뭔말인지 모른다.

           - 7번째 인자 : 그냥 NULL로 쓰자.

 

     2) 포트설정 

 

           - dcb.BaudRate : 전송속도 정하는 것이다. 9.6K, 14.4K같은거... 9600, 14400 이렇게 넣으면 된다.

                                    이거만 정하고 나머진 기본으로 가면 그냥 뚫린다. 귀찮게 다른 값들은 건들면 노노~

           - dcb.ByteSize : 데이터비트다. 기본 8

           - dcb.Parity : 패리티다. 기본 0

           - dcb.StopBits : 정지비트다. 기본 1

 

3. 사용완료했으면 닫아줘야지.

    - COM포트를 열어서 다 사용했다면 그만쓰겠다고 신고해야하는거 아니겠어.

 

     SetCommMask(m_hComm, 0);
     PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
     CloseHandle(m_hComm);

                     

     열때 사용했던 핸들만 조용히 CloseHandle해주면 된다.

 

4. COM포트로 데이터 날려보내기.

    - WriteFile을 사용해서 Open한 포트로 데이터를 날려보내면 된다. Writedata[]의 값이 날아간다.

       dwWritten의 값이 0으로 return되면 안 날아간거니 소스 다시 뜯어보도록~

 

5. 데이터 받기.

    - ReadFile을 사용해서 들어오는 데이터를 읽으면 된다. 읽은 데이터는 pBuff에 저장된다.

 

 

 

 

 

           

          

 

 

Posted by 둔한늑대
,