메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

시리얼통신 소스( C# .NET )
기초
2010.06.24 17:42

02_이벤트로 수신데이터 받기

조회 수 36249 추천 수 0 댓글 4
Atachment
첨부 '2'
?

단축키

Prev이전 문서

Next다음 문서

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

전체 소스

        WATSerialCom_20100624.zip    


RX 이벤트를 사용하여 데이터 받기

        RX 데이터를 버튼을 이용하여 받는 방식을 이용하면 계속 RX 버튼을 눌러야 하는 단점이 있습니다.

        이것을 RX 이벤트를 이용하여 데이터를 받았을 때만 처리하도록 수정해 볼 겁니다.


RX 이벤트용 함수 만들기

        먼저 RX 값을 뿌려줄 EDITBOX를 추가합니다.

        Name : txtRxData

        Multiline : TRUE

        ScrollBars : Vertical


        그리고 RX 값을 HEXA 값으로 표시할 것인지 CHAR 값으로 표시할 것인지를 선택할 체크박스를 추가합니다.

        Name : chkRxHexa

        Text : RX HEXA?


        아시는 분은 아시겠지만 VC 6.0 에서는 쓰레드를 사용하여 MESSAGE 를 날려 주는 불편함이 있었습니다.

        그럼 여기서도 복잡한 쓰레드를 생성해서 MESSAGE를 날려 줘야 하느냐? 고 생각이 드는 분도 계실겁니다.

       

        다행히 C# 에서는 기본적으로 시리얼RX 이벤트를 제공해 줍니다.

        추가하는 방법도 간단합니다.

        포트를 OPEN 하기 전에 DataReceived 속성에 RX 시에 실행할 함수를 설정하고 그 함수를 작성하면 됩니다.

       

m_sp1.DataReceived += new SerialDataReceivedEventHandler(EventDataReceived);

       
//Serial Port Event
        void EventDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int iRecSize = m_sp1.BytesToRead; // 수신된 데이터 갯수
            string strRxData;

            if (iRecSize != 0) // 수신된 데이터의 수가 0이 아닐때만 처리하자
            {
                strRxData = "";
                byte[] buff = new byte[iRecSize];

                m_sp1.Read(buff, 0, iRecSize);

                for (int iTemp = 0; iTemp < iRecSize; iTemp++)
                  foreach (byte bData in buff)
                   {
                    if (chkRxHexa.Checked)
                        strRxData += " " + buff[iTemp].ToString("X2");
                    else
                        strRxData += Convert.ToChar(buff[iTemp]);
                }
                txtRxData.Text += strRxData;
            }
        }

         아래처럼 RX 값을 CHAR로 표시 또는 HEXA값으로 표시할수 있습니다.

        watSerialcom_RX1.gif 


        이제 RX 버튼이 필요 없으므로 삭제를 해야 합니다. ( 삭제하는 방법은 여러가지입니다.)

        폼디자인에서 RX 버튼을 선택한후 DEL 키를 눌러 지웁니다.

        그리고 함수 (  private void btnRx_Click(object sender, EventArgs e) ) 를 직접 지웁니다.

       

        지금까지 수신 값을 이벤트를 사용하여 처리해보았습니다.

        다음에는 원하는 데이터를 보낼수 있도록 수정해 보겠습니다.

TAG •
  • 흑꼬 2015.04.21 18:55
    텍스트창에 바로 수신된 데이터가 가는건가요?
    크로스 스레드 에러가 발생해서 해결방법이 안보입니다ㅠㅠ
  • WhiteAT 2015.04.21 22:29
    여러가지 해결 방법이 있는데 가장 간단하게

    CheckForIllegalCrossThreadCalls = false;

    한줄 추가해 주세요.~

    http://docs.whiteat.com/?p=283 참조하세요
  • 흑꼬 2015.04.27 18:10
    말씀하신 내용으로 적용을 해보았는데 오류가 계속 발생하네요ㅠㅠ
    invoke를 활용한 디테일한 오류수정 방법을 알려주시겠어요?ㅠㅜㅠ
  • WhiteAT 2015.04.27 18:27

    invoke 로 해결해야 한다면


    https://msdn.microsoft.com/en-us/library/ms171728(v=vs.85).aspx

    를 참조해 보세요.

    SetText 가 아래와 비슷해질 겁니다.



    private void SetText(string text)
    {
       if (this.txtRxData.InvokeRequired)
       { 
          SetTextCallback d = new SetTextCallback(SetText);
          this.Invoke(d, new object[] { text });
       }
       else
       {
          this.txtRxData.Text += strRxData;
       }
    }