예제 #1
0
        public List <byte> Encode(List <byte> rawBytes)
        {
            List <byte> tmpBytes = new List <byte>(rawBytes);

            tmpBytes.Add(Crc8.Calculate(tmpBytes));

            List <byte> encodedData = new List <byte>();

            encodedData.Add((byte)FrameChar.END);

            for (int i = 0; i < tmpBytes.Count; i++)
            {
                switch (tmpBytes[i])
                {
                case (byte)FrameChar.END:
                    encodedData.Add((byte)FrameChar.ESC);
                    encodedData.Add((byte)FrameChar.ESC_END);
                    break;

                case (byte)FrameChar.ESC:
                    encodedData.Add((byte)FrameChar.ESC);
                    encodedData.Add((byte)FrameChar.ESC_ESC);
                    break;

                default:
                    encodedData.Add(tmpBytes[i]);
                    break;
                }
            }

            encodedData.Add((byte)FrameChar.END);

            return(encodedData);
        }
예제 #2
0
        public byte[] encode(List <byte> bytes)
        {
            List <byte> frame = new List <byte>();

            setCommLog(bytes, "Tx");

            byte crc = Crc8.Calculate(bytes);

            bytes.Add(crc);

            frame.Add((byte)FrameChar.END);

            for (int i = 0; i < bytes.Count; i++)
            {
                switch (bytes[i])
                {
                case (byte)FrameChar.END:
                    frame.Add((byte)FrameChar.ESC);
                    frame.Add((byte)FrameChar.ESC_END);
                    break;

                case (byte)FrameChar.ESC:
                    frame.Add((byte)FrameChar.ESC);
                    frame.Add((byte)FrameChar.ESC_ESC);
                    break;

                default:
                    frame.Add(bytes[i]);
                    break;
                }
            }

            frame.Add((byte)FrameChar.END);

            return(frame.ToArray());
        }
예제 #3
0
        public void decode(byte[] bytes)
        {
            foreach (var tmp in bytes)
            {
                RxBytes.Enqueue(tmp);
            }

            while (RxBytes.Count != 0)
            {
                byte tmp = RxBytes.Dequeue();

                if (tmp == (byte)FrameChar.END)
                {
                    // Start SLIP Frame
                    if (RcvFlg == false)
                    {
                        RcvFlg   = true;
                        RcvFrame = new List <byte>();
                    }
                    else
                    {
                        if (RcvFrame.Count == 0)
                        {
                            // receive order FRAMECHAR.END,FRAMECHAR.END
                            // Last FRAMECHAR.END might be Start of Frame
                            RcvFlg = true;
                        }
                        else
                        {
                            byte crc = Crc8.Calculate(RcvFrame);

                            if ((crc == 0x00) &&
                                (RcvFrame.Count >= 2))
                            {
                                // End SLIP Frame

                                // delete useless crc data size
                                RcvFrame.RemoveRange((RcvFrame.Count - 1), 1);

                                string time = setCommLog(RcvFrame, "Rx");

                                RxDataParam rxData = new RxDataParam();

                                rxData.Time = time;
                                rxData.Data = new List <byte>(RcvFrame);

                                myComponents.ReceiveStream.Enqueue(rxData);

                                RcvFrame = new List <byte>();

                                RcvFlg = false;
                            }
                            else
                            {
                                RcvFlg   = true;
                                RcvFrame = new List <byte>();
                            }
                        }
                    }
                }
                else
                {
                    if (EscFlg == true)
                    {
                        EscFlg = false;

                        switch (tmp)
                        {
                        case (byte)FrameChar.ESC_END:
                            RcvFrame.Add((byte)FrameChar.END);
                            break;

                        case (byte)FrameChar.ESC_ESC:
                            RcvFrame.Add((byte)FrameChar.ESC);
                            break;
                        }
                    }
                    else if (tmp == (byte)FrameChar.ESC)
                    {
                        EscFlg = true;
                    }
                    else
                    {
                        if (RcvFlg == true)
                        {
                            RcvFrame.Add(tmp);
                        }
                    }
                }
            }
        }