전체 소스
        WATSerialCom_20100623.zip


새로운 프로젝트를 생성
        이름 : WATSerialCOM
        C#용 프로젝트 생성방법은 http://whiteat.com/31559 를 참고하세요.


타이틀 변경 
        폼의 [Text] 속성 값을 "C#으로 만드는 시리얼 통신 프로그램"으로 합니다.
        폼의 [Name] 속성 값을 "frmMain" 으로 합니다.


컴포트와 보레이트 설정하는 EDITBOX를 추가
        2개의 레이블과 2개의 EDITBOX를 추가한후 EDITBOX에 명명합니다.
        (레이블은 사용하지 않기 때문에 이름을 특별히 부여할 필요가 없습니다.)
        COM PORT용 EDITBOX 이름 : txtComNum
        BaudRate 용 EDITBOX 이름 : txtBaudRate


OPEN,CLOSE,SEND,RX 버튼 추가
      4개의 버튼을 추가한후 각각의 이름과 TEXT를 붙입니다..
      OPEN : btnOpen            // 포트 열기
      CLOSE : btnClose          // 포트 닫기
      SEND : btnSend             //  데이터 보내기
       RX : btnRX                   // 데이터 받기  ( 지금은 수신 이벤트를 사용하지 않고, 수동으로 받는것을 하겠습니다.)

지금까지 디자인한 폼은 다음과 같을 것입니다.        watSerialcom1.gif

 EDITBOX의 기본값 설정 및 필요한 변수 추가하기
      기본 값 설정은 간단합니다. 폼이 생성될때 txtComNum 과 txtBaudRate 에 기본값을 설정해 주면 됩니다.
        시리얼 통신을 하기 위해서는 SerialPort 모듈이 필요합니다.
        using 으로 System.IO.Ports 를 추가해주고, 실제로 사용할 m_sp1 을 추가해줍니다.
                using System.IO.Ports;
                SerialPort m_sp1;

OPEN  기능 추가
        OPEN 버튼을 더블 클릭하여 OPEN 기능을 추가해줍니다.

private void btnOpen_Click(object sender, EventArgs e)
        {
            try
            {
                // m_sp1 값이 null 일때만 새로운 SerialPort 를 생성합니다.
                if (null == m_sp1)
                {
                    m_sp1 = new SerialPort();
                    m_sp1.PortName = txtComNum.Text;   // 컴포트명
                    m_sp1.BaudRate = Convert.ToInt32(txtBaudRate.Text);   // 보레이트

                    m_sp1.Open();
                }

                btnOpen.Enabled = !m_sp1.IsOpen;    // OPEN BUTTON Disable
                btnClose.Enabled = m_sp1.IsOpen;     // CLOSE BUTTON Enable
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


 CLOSE 기능 추가
        CLOSE 버튼을 더블클릭하여 CLOSE 기능을 추가해줍니다.

        private void btnClose_Click(object sender, EventArgs e)
        {
            // m_sp1 이 null 아닐때만 close 처리를 해준다.
            if (null != m_sp1)
            {
                if (m_sp1.IsOpen)
                {
                    m_sp1.Close();
                    m_sp1.Dispose();
                    m_sp1 = null;
                }

            }
            btnOpen.Enabled = true;
            btnClose.Enabled = false;        

      }
       


 SEND 기능 추가
        SEND 버튼을 더블클릭하여  SEND 기능을 추가합니다.            

try
            {
                m_sp1.Write("ABC");
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

RX 기능 추가 
        RX 버튼을 더블클릭하여  RX 기능을 추가합니다.       

private void btnRx_Click(object sender, EventArgs e)
        {
            int iRecSize = m_sp1.BytesToRead; // 수신된 데이터 갯수
            string strRxData;
            try
            {
                if (iRecSize != 0)
                {
                    strRxData = "";
                    byte[] buff = new byte[iRecSize];

                    m_sp1.Read(buff, 0, iRecSize);
                    for (int iTemp = 0; iTemp < iRecSize; iTemp++)
                    {
                        strRxData += Convert.ToChar(buff[iTemp]);
                    }
                    MessageBox.Show(strRxData);
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


기능 테스트
       하드웨어를 연결하여 실제로 동작하는지 테스트를 해봐도 되는데
        가상 시리얼포트가 설치 되어있으면 테스트하기가 더욱 쉬울 겁니다.

        COM3 용   

        COM4 용

         COM3에서 SEND 버튼을 12번 누르고 COM4에서 RX 버튼을 눌러
        다음처럼 ABC가 12번 들어 왔음을 확인할 수 있다.

        watSerialcom4.gif

 

여기까지는 거의 하드코딩으로 프로그램을 작성해서 시리얼 통신이 되는지만 확인한 겁니다.~~
다음에는 SEND 와 RX 기능(이벤트 사용)을 보완하여 추가하겠습니다.

출처 : http://whiteat.com/31581

+ Recent posts