/// <summary> /// создание пакета в виде массива байт /// </summary> /// <returns></returns> private byte[] PackageMessage(BedMessageEventType eventType, byte registerAddress, byte[] messageData) { var message = new byte[10]; message[0] = (byte)_startMessageMarker; message[1] = _idDevice; message[2] = (byte)eventType; message[3] = _messageLength; message[5] = registerAddress; message[6] = messageData[0]; message[7] = messageData[1]; var messageForCRC = new byte[message.Length - 2]; for (var i = 0; i < messageForCRC.Length; i++) { messageForCRC[i] = message[i]; } var crc = BitConverter.GetBytes(BedMessageCRC16.GetCRC16(messageForCRC)); if (BitConverter.IsLittleEndian) { Array.Reverse(crc); } message[8] = crc[0]; message[9] = crc[1]; return(message); }
public BedMessage( BedMessageEventType eventType, byte messageLength = 2) //при запросе всех регистров - Length всегда 2 (адрес и дата по 1 слову) { _eventType = eventType; _messageLength = messageLength; _idDevice = 1; }
/// <summary> /// обработать полученное сообщение и извлечь из него данные /// </summary> /// <param name="inputMessage"></param> private void UnPackageMessage(byte[] inputMessage) { if (inputMessage == null || inputMessage.Length <= 4) { throw new IndexOutOfRangeException("Пакет пуст или поврежден"); } if ((char)inputMessage[0] != '$') { throw new ArgumentException("Формат пакета неверен - не найден маркер начала пакета"); } _idDevice = inputMessage[1]; _eventType = (BedMessageEventType)inputMessage[2]; _messageLength = inputMessage[3]; if (_messageLength == 0) { throw new ArgumentException("В пакете нет данных"); } //ответный пакет это заголовок(1 байт) + ID (1) + тип (1) + размер данных в словах(1) //затем данные и 2 байта CRC16 if (inputMessage.Length != 4 + _messageLength * 2 + 2) { throw new ArgumentException("Неверный размер пакета"); } var messageForCRC = new byte[inputMessage.Length - 2]; //CRC считаем для пакета кроме самой суммы for (var i = 0; i < messageForCRC.Length; i++) { messageForCRC[i] = inputMessage[i]; } var crcCalc = BedMessageCRC16.GetCRC16(messageForCRC); var crcReal = (ushort)(inputMessage[inputMessage.Length - 2] * 256 + inputMessage[inputMessage.Length - 1]); if (crcReal != crcCalc) { throw new ArgumentException("Неверная контрольная сумма"); } _messageData = new byte[_messageLength * 2]; if (inputMessage.Length < _messageData.Length + 4) { throw new ArgumentException("Неверный размер пакета"); } for (var i = 0; i < _messageData.Length; i++) { _messageData[i] = inputMessage[i + 4]; } }