Ejemplo n.º 1
0
        public byte[] encode(int seq, byte[] cmd)
        {
            var msglen = MESSAGE_MIN + cmd.Length;

            seq = seq & MESSAGE_SEQ_MASK | MESSAGE_DEST;
            var @out = new List <byte> {
                (byte)msglen,
                (byte)seq
            };

            @out.AddRange(cmd);
            @out.AddRange(BitConverter.GetBytes((short)SerialUtil.Crc16_ccitt(@out.ToArray())));
            @out.Add(MESSAGE_SYNC);
            return(@out.ToArray());
        }
Ejemplo n.º 2
0
        public object check_packet(byte[] s)
        {
            if (s.Length < MESSAGE_MIN)
            {
                return(0);
            }
            var msglen = s[MESSAGE_POS_LEN];

            if (msglen < MESSAGE_MIN || msglen > MESSAGE_MAX)
            {
                return(-1);
            }
            var msgseq = s[MESSAGE_POS_SEQ];

            if ((msgseq & ~MESSAGE_SEQ_MASK) != MESSAGE_DEST)
            {
                return(-1);
            }
            if (s.Length < msglen)
            {
                // Need more data
                return(0);
            }
            if (s[msglen - MESSAGE_TRAILER_SYNC] != MESSAGE_SYNC)
            {
                return(-1);
            }
            var msgcrc = BitConverter.ToInt16(s, msglen - MESSAGE_TRAILER_CRC);
            var crc    = SerialUtil.Crc16_ccitt(new ReadOnlySpan <byte>(s, 0, msglen - MESSAGE_TRAILER_SIZE));

            if (crc != msgcrc)
            {
                logging.Debug("got crc {0} vs {1}", crc, msgcrc);
                return(-1);
            }
            return(msglen);
        }