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);