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