:: 진공에 대해 알려주마.

C# Read InBuffer 본문

비정기 피엠

C# Read InBuffer

하이백 2021. 6. 22. 22:34

C#에는 serial port의 수신 버퍼의 값을 읽어오는 여러 가지 방법이 있다. 아래 두 개의 함수가 그것들인데 Read 함수를 사용하던 중 문제가 발생하여 원인을 해결하고자 찾아본 내용이다.

.Read()
https://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport.read?view=dotnet-plat-ext-5.0

.ReadExisting()
https://docs.microsoft.com/ko-kr/dotnet/api/system.io.ports.serialport.readexisting?view=dotnet-plat-ext-5.0

처음에는 read() 함수를 사용하였으나 회신된 내용이 앞쪽 일부만 보여지는 문제가 발생하였다. 확인해 보니 회신된 내용이 길어지는 경우 내가 원하는 대로 회신된 내용을 한 번에 읽지 못하고 수신 이벤트 발생 즉시 값이 읽으니 앞쪽만 읽히는 현상이었다. 다시 버퍼를 읽어 오니 나머지 내용이 모두 들어있다.

또한 Hex code 처리가 아닌 경우에는 string으로 처리되는 ReadExisting()이 월씬 유리하다. 이전에는 항상 char[]만 사용할 수 있어서 관성적으로 사용하였으나 여기서는 다양한 방법으로 처리할 수 있어 자신에게 유리한 것을 사용하면 된다.

 


 

참고 코드


// 포트 생성과 이벤트를 초기화 부분에 추가
ComPort = new SerialPort();
ComPort.DataReceived += new SerialDataReceivedEventHandler(ComPort_DataReceived);

//
private void OpenSerialPort()
{
    try
    {
        if (!ComPort.IsOpen)
        {
            // 시리얼 포트의 파라메터를 설정한다.
            ComPort.BaudRate	= Convert.ToInt32(BAUD_RATE);
            ComPort.DataBits	= Convert.ToInt32(DATA_BIT);
            ComPort.Parity  	= Parity.None;
            ComPort.StopBits	= StopBits.One;
            // 시리얼 포트를 연다.
            ComPort.Open();
        }
    }
    catch (System.Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

//
void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // 수신 데이터 문자수 확인
    string strRecData = string.Empty;

    // 수신 버퍼의 값을 모두 읽어 온다.
    strRecData = ComPort.ReadExisting();

    // 수신된 문자열을 파일에 저장한다.
    WriteLog( strRecData );

    // UI Cross thread invoke
    this.Invoke( new MethodInvoker( delegate
    {
        // RichTextBox에 표시하기
        PrintStringToRTBox( strRecData );
    }));
}

 

'비정기 피엠' 카테고리의 다른 글

C, C++ Operator "=+"  (0) 2022.04.20
RS-232 to TTL  (0) 2022.02.09
구글 지메일 외부에서 접근하기  (0) 2021.03.11
집으로...  (0) 2021.02.08
BLUETOOTH 수화기  (0) 2021.01.27
Comments