Computers/Language 2014. 3. 18. 22:38








C# - 시리얼 포트 데이터 읽기

시리얼포트의 serialPort_DataReceived 이벤트 발생은

C#이 너무 늦은 건지 여러 줄을 받은 후 이벤트를 발생시키기 때문이다

반드시 버퍼에 한줄이 있다는 가정을 하지 말고 시리얼 버퍼에는 

여러줄이 들어 있을수 있다는 점을 고려해서

처리루티을 작성해야 한다.


How to read serial data in C#

- In C#, at the event of 'serialPort_DataReceived' 

- the receive buffer may contain many data lines

   even if the sender sent line by line with "\n" or something




        // --------------------------------------------------------------------------

        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            try

            {

                receiveBuffer = serialPort.ReadExisting();      // 2013.03.18 - 수신데이터 모두읽음

                //receiveBuffer = serialPort.ReadTo("\r");

                this.Invoke(new EventHandler(DisplayText));

            }

            //catch (System.TimeoutException)

            catch (Exception ex)

            {

                //MessageBox.Show("COM Error" + ex.ToString());

            }

        }


            receiveTextParse += receiveBuffer;

            // -----------------------------------------------------------------------

            // AVR에서 라인별로 송신해도 C#에서 읽은 시리얼 포트 데이터는 붙어있다.

            // 즉 receiveBuffer 안에는 "\r"로 구분된 여러개의 데이터 포함됨

            // receiveBuffer - DataReceive Event 때 COM 포트에서 읽은데이터 

            // receiveTextParse - parse 하기위해 모아 놓은 배열, "\r"로 끝나지 않은 데이터 보존

            // -----------------------------------------------------------------------

             string mBlock;

            int endOfLineIndex;

            do

            {   // if No return '-1' from IndexOf

                endOfLineIndex = receiveTextParse.IndexOf("\r");

                if (endOfLineIndex == 0)

                {

                    receiveTextParse = receiveTextParse.Remove(0, 1);     // remove the "\r" at the beginning

                }

                else if (endOfLineIndex > 0)

                {

                    mBlock = receiveTextParse.Substring(0, endOfLineIndex);

                    receiveTextParse = receiveTextParse.Remove(0, endOfLineIndex);

                    ParseText(mBlock);

                    rtboxReceive.AppendText(mBlock + "\r");      // CR추가

                    rtboxReceive.SelectionStart = rtboxReceive.Text.Length;

                    rtboxReceive.ScrollToCaret();

                    receiveTextBuffer = mBlock;                  // 수신내용 복사

                    tbReceived.Text = mBlock;

                    using (StreamWriter file = new StreamWriter(logFileCAN232, true))

                    {

                        file.WriteLine(tbReceived.Text);        // 2014.03.18 - moved Here

                    }

                }

            } while (endOfLineIndex >= 0);





posted by 털보네i

댓글을 달아 주세요