메뉴 건너뛰기

OBG

Programming

MoA
조회 수 4456 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

Visual C++ 시리얼 통신(RS-232) 강좌 (2)



그럼 이제 1 편에서 만든 시리얼 클래스를 어떻게 사용할 것인가에 대한 강좌를 시작하겠습니다.

일단 테스트하기 쉽게 다이얼로그 기반 프로젝트를 하나 생성하고, 저는 프로젝트 이름을SerialTest라 하였습니다아래 그림과 같이 시리얼 포트를 열고 닫기 위해 버튼을 두개 만들고 에디트 박스에 있는 내용을 보내기 위해 보내기 버튼을 하나 만들었습니다그리고 받은 데이터를 표시하기 위해서 리치에디트 박스를 하나더 추가 하였습니다.

순수하게 시리얼 테스트만을 위한 것이라 UI는 볼품없지만 그래도 이정도면 훌륭하죠 ㅋㅋㅋ

 

먼저 시리얼포트를 사용하기 위해서 프로젝트에 1편에서 만든 클래스를 추가 시킵니다.

그리고 헤더를 추가시킵니다.

SerialTestDlg.h : 헤더 파일에 PYH_Comm.h을 include 합니다그런다음 CPYH_Comm*m_Comm이라는 클래스 객체 포인터를 멤버변수로 하나 선언하겠습니다여기까지만 끝나면 기본적으로 시리얼포트를 열고 닫을 수 있습니다.

연결 버튼을 누를 때 시리얼 포트가 열리도록 해보겠습니다.

 

void CSerialTestDlg::OnBnClickedButton1()

{

             CString str = "COM1";

             m_Comm= new CPYH_Comm("\\.\"+str,"115200","None","8 Bit","1 Bit");         // initial Comm port

             if(           m_Comm->Create(GetSafeHwnd()) != 0)          //통신포트를 열고 윈도우의 핸들을 넘김

             {

                           AfxMessageBox("열렸다!!!");

                           m_Comm->Clear();

                           GetDlgItem(IDC_BUTTON1)->EnableWindow(false);

                           GetDlgItem(IDC_BUTTON2)->EnableWindow(true);

             }

             else

             {

                           AfxMessageBox("제대로설정안할래!!");

                           GetDlgItem(IDC_BUTTON1)->EnableWindow(true);

                           GetDlgItem(IDC_BUTTON2)->EnableWindow(false);

             }

}

 

소스 내용 중 "\\.\" CreateFile 함수 때문에 넣어 주는 것입니다. COM1 ~ COM9 까지는 앞의 내용이 없어도 정상적으로 동작하지만 시리얼포트 번호가 COM10 이상이 되면 앞에"\\.\" 문자열을 넣지 않으면 INVALID_HANDLE_VALUE  NULL 이 리턴되어 시리얼포트가 열리지 않습니다.

자 이제 끊기 버튼을 눌러 시리얼 포트를 닫아 보겠습니다.

 

void CSerialTestDlg::OnBnClickedButton2()

{

             if(m_Comm)          // 컴포트가 존재하면

             {

                           m_Comm->Close();

                           m_Comm = NULL;

                           GetDlgItem(IDC_BUTTON1)->EnableWindow(true);

                           GetDlgItem(IDC_BUTTON2)->EnableWindow(false);

             }

}

 

자 간단하죠 걍 Close 함수를 호출하고 포인터를 NULL로 해주면 끝납니다그러나 이게 끝이 아닙니다아직도 할 일이 남았죠 overlapped i/o 핸들도 종료를 시켜야 합니다근데 언제 종료하죠아직 Receive 쓰레드가 종료되었는지 아닌지 모르기 때문에 아무때나 핸들을 닫아버리면 쫑이 날 수도 있습니다그레서 쓰레드가 종료될 때 윈도우에 SendMessage(Comm->m_hWnd,WM_MYCLOSE,0,temp); 쓰레드가 종료되었다는 메시지를 보내 주도록 하였습니다이 메시지를 받아서 overlapped i/o 핸들도 종료시키면 안전하게 되는거죠.

따라서 우리는 이 메시지를 받는 함수만 만들면 됩니다먼저 BEGIN_MESSAGE_MAP User 메시지 발생시 호출할 함수를 맵핑합니다저는 ON_MESSAGE(WM_MYCLOSE,OnThreadClosed)이렇게 맵핑을 하겠습니다WM_MYCLOSE이 메시지는 시리얼클래스 헤더에 이미 선언하였습니다.

그런 다음 다음과 같이 쓰레드가 종료되었다는 메시지를 받으면 핸들을 종료 시키도록 합니다.이렇게 해서 열고 닫는 방법에 대해서 알아봤습니다.

 

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

{

             //overlapped i/o 핸들을 닫음

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

             delete ((CPYH_Comm*)lpara);

 

             return 0;

}

 

이제 무엇을 해야 할까요그렇죠 데이터가 들어오면 받고 전송할 데이터가 있으면 내보내야 겠죠?

먼저 들어오는 데이터를 받아 보겠습니다. 1편에서 말씀 드린대로 receive  쓰레드에서 데이터가 들어오면 버퍼에 복사하고 윈도우로 메시지를 날린다고 했습니다우리는 그럼 그 메시지를 받아서 버퍼안에 있는 데이터를 받아오면 됩니다구현방법은 OnThreadClosed 와 같습니다. ON_MESSAGE(WM_MYRECEIVE,OnReceive) 이렇게 맵핑을 하고 다음과 같이 구현하였습니다.

 

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

{

             CString str;

             char data[20000];

             if(m_Comm)

             {

                           m_Comm->Receive(data,length);                    // length 길이 만큼 데이터를 얻음

                           data[length]='';

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

                           {

                                        str += data[i];

                           }

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

                           str = "";

             }

             return 0;

}

 

자 이제 마지막으로 데이터를 보내는 함수만 만들면 됩니다보내는 함수는 간단히 다음과 같이 구현할 수 있습니다보내기 버튼을 누르면 에디트 박스의 내용을 전송하도록 하겠습니다.

 

void CSerialTestDlg::OnBnClickedButton3()

{

             CString str;

             GetDlgItem(IDC_EDIT1)->GetWindowText(str);

             str+= "rn";

             m_Comm->Send(str,str.GetLength());

}

 

별 내용 없죠걍 에디트 박스 내용 얻어다가 CR+LF 붙여서 날리는 겁니다.

이렇게 하면 시리얼 테스트 프로그램 완성입니다나머지는 소스를 확인하세요마지막으로 프로그램을 쫌 이쁘게 하는 것은 노가다를 얼마나 많이 하느냐에 달린 것이고 부가적인 기능구현도 마찬가지 입니다핵심을 알면 나머지는 시간과 노력을 얼마나 들이느냐 입니다.

그럼 이상으로 시리얼통신 강좌를 마치겠습니다. ^^

[첨부: 강좌 1, 2편 및 샘플코드 ]

 

 


2차 출처 : http://roter.pe.kr/81
?

  1. Programming 게시판 관련

    Date2014.11.01 CategoryTool/etc ByMoA Views1708
    read more
  2. XML 파싱하기

    Date2013.08.06 CategoryJAVA/Android ByMoA Views7062
    Read More
  3. Visual C++ 시리얼 통신(RS-232) 강좌 (1)

    Date2013.07.28 CategoryAPI/MFC ByMoA Views6713
    Read More
  4. AS3 Code Library

    Date2013.10.11 CategoryLibrary ByMoA Views5023
    Read More
  5. Sleep() 함수 대신 프로그램 딜레이 시키기 (Wait)

    Date2013.07.28 CategoryAPI/MFC ByMoA Views4711
    Read More
  6. Visual C++ 시리얼 통신(RS-232) 강좌 (2)

    Date2013.07.28 CategoryAPI/MFC ByMoA Views4456
    Read More
  7. MFC 리본 사용하기 (아이콘 제작 포함)

    Date2012.02.09 CategoryAPI/MFC By너울 Views4345
    Read More
  8. logcat 사용법

    Date2013.05.28 CategoryJAVA/Android ByMoA Views3485
    Read More
  9. 프린터 출력하기

    Date2013.10.16 CategoryAPI/MFC ByMoA Views3433
    Read More
  10. 직접 보고 추천하는 머신러닝 & 딥러닝 & 수학 총정리(2022)

    Date2022.07.24 CategoryDeeplearning ByOBG Views3303
    Read More
  11. [액션게임 만들기] 3. 클래스 다이어그램 기초

    Date2014.05.07 CategoryPython ByOBG Views2770
    Read More
  12. DLL 생성 시 주의

    Date2013.08.22 CategoryAPI/MFC ByMoA Views2684
    Read More
  13. [농장게임 만들기] 10. 상점을 추가하자

    Date2014.05.01 CategoryPython ByMoA Views2671
    Read More
  14. Thread와 SendMessage를 통해 DeadLock을 만드는 방법

    Date2013.07.28 CategoryAPI/MFC ByMoA Views2625
    Read More
  15. 다국어를 위한 StringTable, LoadString

    Date2013.12.22 CategoryAPI/MFC ByMoA Views2408
    Read More
  16. C 언어의 문자형 변수 char - 8비트 정수형 변수

    Date2013.07.28 CategoryC/C++ ByMoA Views2228
    Read More
  17. [농장게임 만들기] 3. 배경을 그리자

    Date2014.04.28 CategoryPython ByMoA Views2066
    Read More
  18. 파이썬에서 C모듈 사용하기

    Date2014.02.10 CategoryPython ByMoA Views1919
    Read More
  19. 프로세스 - 생성과 종료 그리고 이것 저것

    Date2011.10.12 CategoryAPI/MFC By너울 Views1834
    Read More
  20. 졸업작품 및 각종 과제물 프로그램은 어떻게 만들어야 하나? (윈도우즈 응용프로그램)

    Date2013.09.10 CategorySite ByMoA Views1644
    Read More
  21. 다른 스레드에서 메인다이얼로그 포인터 받아오기 AfxGetMainWnd()

    Date2013.07.28 CategoryAPI/MFC ByMoA Views1614
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 15 Next
/ 15
위로