ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#]Serial 버퍼 Data 이어 붙이기
    C#/WPF_예제소스 2022. 3. 28. 11:28
    private void SP_TempData()
            {
                Buffer.BlockCopy(bTemp, 0, bBuffer, 0, iTempLen);   //iTempLen == bTemp.length
                while ((iBuffLen + iTempLen) < bBuffer.Length)
                {
                    try
                    {
                        int len = sp.Read(bBuffer, iTempLen + iBuffLen, (bBuffer.Length - (iTempLen + iBuffLen)));
                        iBuffLen += len;
                    }
                    catch (Exception ex)
                    {
                        break;
                    }
                }
                iBuffLen = 0;
    
                iSyncHeader = SyncChar.Length + bHeader.Length + bReserved.Length;  // 8바이트 + 8바이트 + 8바이트 = 24바이트
                for (int offsetNo = 0; offsetNo < intBytes - SyncChar.Length; offsetNo++)
                {
                    int okLen = 0;
                    for (int okNo = 0; okNo < SyncChar.Length; okNo++)
                    {
                        if (bBuffer[offsetNo + okNo] == SyncChar[okNo]) okLen++;
                    }
                    if (okLen == SyncChar.Length)
                    {
                        iDataNo = offsetNo + iSyncHeader;
                        iTempLen = bBuffer.Length - (iDataNo + idataLen);
                        if (iTempLen < 0) iTempLen = 0;
    
                        Buffer.BlockCopy(bBuffer, offsetNo + okLen, bHeader, 0, bHeader.Length);    // 헤더파싱
                        if (intBytes - iDataNo >= idataLen)  // 버퍼가 온도 데이터크기 이상일 경우
                        {
                            try
                            {
                                Buffer.BlockCopy(bBuffer, iDataNo, bData, 0, bData.Length);
                                Buffer.BlockCopy(bBuffer, iDataNo + idataLen, bTemp, 0, iTempLen);    // 남은 바이트 bTemp에 보관
                                UpdateFrameData(spID, bData);
                                break;
                            }
                            catch (Exception ex)
                            {
                                Debug.WriteLine(ex.Message);
                            }
                        }
                        else     // 버퍼가 온도 데이터 크기보다 작을 경우
                        {
                            try
                            {
                                sp.Read(bTemp, 0, idataLen - (intBytes - iDataNo)); //부족한 온도데이터만큼 읽어들여서 intBytes == bBuffer.length
                                Buffer.BlockCopy(bBuffer, iDataNo, bData, 0, (intBytes - iDataNo)); //bData에 버퍼의 온도데이터 파싱
                                Buffer.BlockCopy(bTemp, 0, bData, (intBytes - iDataNo), idataLen - (intBytes - iDataNo)); //bData에 부족한 온도데이터 파싱
                                iTempLen = 0;
                                UpdateFrameData(spID, bData);
                                break;
                            }
                            catch (Exception ex)
                            {
                                Debug.WriteLine(ex.Message);
                            }
                        }
                    }
                }
    
                if (iArrData != null)
                {
                    iSenNo = bHeader[0];
                    EventFrameDataHandler?.Invoke(iSenNo, iArrData);    // MainWindow에서 EventFrameDataHandler에 추가한 메소드 실행.
                }
                string bufferValue = BitConverter.ToString(bBuffer);//.Replace("-", "");
    
                Debug.Write(bufferValue);
                Debug.WriteLine("");
                Debug.WriteLine(bBuffer.Length);
                Debug.WriteLine("Header: " + BitConverter.ToString(bHeader));
                Debug.WriteLine("Sensor No: " + iSenNo);
            }
    728x90

    'C# > WPF_예제소스' 카테고리의 다른 글

    [C#]CSV파일  (0) 2022.03.30
    [C#] 파일경로 설정  (0) 2022.03.29
    [C#]Polygon  (0) 2022.02.28
    [C#]Viewport2DVisual3D  (0) 2022.02.28
    [C#] Thread vs Threadstart  (0) 2022.02.18

    댓글

Designed by Tistory.