Exemple #1
0
        public ushort GetChecksum()
        {
            List <byte> bytes = new List <byte>();

            bytes.AddRange(BitConverter.GetBytes(MessageType));
            bytes.AddRange(BitConverter.GetBytes(SenderID));
            bytes.Add(Length);
            bytes.AddRange(Payload.Data);
            return(Crc16CcittKermit.ComputeChecksum(bytes.ToArray()));
        }
Exemple #2
0
 public bool ValidateCheckSum()
 {
     if (ReceicevedChecksum.HasValue)
     {
         List <byte> bytes = new List <byte>();
         bytes.AddRange(BitConverter.GetBytes((ushort)(int)MessageType.Value));
         bytes.AddRange(BitConverter.GetBytes(SenderID.Value));
         bytes.Add(Length.Value);
         bytes.AddRange(Payload);
         return(Crc16CcittKermit.ComputeChecksum(bytes.ToArray()) == ReceicevedChecksum.Value);
     }
     else
     {
         return(false);
     }
 }
        protected override void ProcessReading(bool restart)
        {
            if (restart)
            {
                _preambleFound = false;
                _messageBytes.Clear();
            }

            if (!_preambleFound)
            {
                while (_receivedBytes.Count > 0)
                {
                    if (_receivedBytes[0] == PREAMBLE)
                    {
                        _preambleFound = true;
                        _receivedBytes.RemoveAt(0);
                        break;
                    }
                    else
                    {
                        _receivedBytes.RemoveAt(0);
                    }
                }
            }

            if (_preambleFound)
            {
                if (_messageBytes.Count == 0)
                {
                    _messageBytes.Add(PREAMBLE);
                }

                if (_messageBytes.Count < 6 && _receivedBytes.Count >= 5)
                {
                    _messageBytes.AddRange(_receivedBytes.GetRange(0, 5));
                    _messageBytes.RemoveRange(0, 5);
                }

                int messageLength = -1;
                if (_messageBytes.Count >= 6)
                {
                    messageLength = (int)_messageBytes[5];
                }

                if (messageLength > 0)
                {
                    if (_receivedBytes.Count > messageLength + 2)
                    {
                        _messageBytes.AddRange(_receivedBytes.GetRange(0, messageLength + 2));
                        _receivedBytes.RemoveRange(0, messageLength + 2);

                        List <byte> crcBytes = new List <byte>();
                        for (int i = 1; i < _messageBytes.Count - 2; i++)
                        {
                            crcBytes.Add(_messageBytes[i]);
                        }

                        ushort crc         = Crc16CcittKermit.ComputeChecksum(crcBytes.ToArray());
                        byte[] crcSumBytes = new byte[2] {
                            _messageBytes[_messageBytes.Count - 2], _messageBytes[_messageBytes.Count - 1]
                        };
                        ushort crcInMessage = BitConverter.ToUInt16(crcSumBytes, 0);
                        if (crc == crcInMessage)
                        {
                            lock (_syncobject)
                                _messageQueue.Enqueue(_messageBytes.ToArray());
                        }
                        else
                        {
                            lock (_syncobject)
                                _readExceptionQueue.Enqueue(new SBPReadExceptionEventArgs(new Exception("CRC not valid")));
                        }
                        _messageBytes.Clear();
                        _preambleFound = false;
                    }
                }
            }
        }