public List <byte> EncapsulatePayload(List <byte> payload)
        {
            if (UseChecksum)
            {
                // Add CheckSum
                var checkSum = ArduinoChecksum.CalculateCheckSum(payload.ToArray());
                payload.Add(checkSum);
            }

            if (UseSTX)
            {
                // Add STX in payload
                payload.Insert(0, STX);
            }

            // Add ETX
            payload.Add(ETX1);
            payload.Add(ETX2);
            return(payload);
        }
        public bool DecapsulateFrame(byte[] buf, out byte[] payload)
        {
            // Find Data Index

            int stxIdx = -1;

            if (UseSTX)
            {
                // Find STX Index in buffer.
                for (var idx = 0; idx < buf.Length; idx++)
                {
                    if (buf[idx] == STX)
                    {
                        stxIdx = idx;
                        break;
                    }
                }
                // Check Whether No Exist STX
                if (stxIdx == -1)
                {
                    payload = null;
                    return(false);
                }
            }

            var dataIdx = stxIdx + 1;

            // Find ETX Index in buffer.
            int etxIdx = -1;

            for (var idx = dataIdx; idx < buf.Length - 1; idx++)
            {
                if (buf[idx] == ETX1 && buf[idx + 1] == ETX2)
                {
                    etxIdx = idx;
                    break;
                }
            }

            // Check Whether No Exist ETX
            if (etxIdx == -1)
            {
                payload = null;
                return(false);
            }

            var arraySpan = new Span <byte>(buf);

            if (UseChecksum)
            {
                // frame => ... [stx(1)] [data(n)] [checksum(1)] [etx(2)] ...
                var checkSumIdx = etxIdx - 1;
                var data        = arraySpan.Slice(start: dataIdx, length: checkSumIdx - dataIdx); // Extract data from frame
                var checkSum    = arraySpan[checkSumIdx];

                var expectedChecksum = ArduinoChecksum.CalculateCheckSum(data.ToArray());
                // Check Checksum Value
                if (expectedChecksum == checkSum)
                {
                    payload = data.ToArray();
                    return(true);
                }
                else
                {
                    // Throw Checksum error
                    payload = null;
                    return(false);
                }
            }
            else
            {
                var data = arraySpan.Slice(start: dataIdx, length: etxIdx - dataIdx); // Extract data from frame
                payload = data.ToArray();
                return(true);
            }
        }