private dynamic PackageParse(byte[] bytes)
        {
            dynamic package = new ExpandoObject();

            if (bytes == null || bytes.Length < 4)
            {
                package.success = false;
                package.error   = "не достаточно данных";
                return(package);
            }

            if (Crc16Modbus.CrcCheck(bytes))
            {
                var skip = bytes[0] == 0 ? 3 : 1;
                package.body = bytes.Skip(skip).Take(bytes.Length - (skip + 2)).ToArray();
                package.code = 1;
            }
            else if (Crc16Modbus.CrcCheck(bytes, true))
            {
                var skip = bytes[0] == 0 ? 3 : 1;
                package.body = bytes.Skip(skip).Take(bytes.Length - (skip + 2)).ToArray();
                package.code = bytes[skip];
            }
            else
            {
                package.success = false;
                package.error   = "не сошлась контрольная сумма";
                return(package);
            }

            package.success = true;
            package.error   = string.Empty;
            return(package);
        }
        public byte[] MakePackage(byte code, byte[] data)
        {
            ////
            byte[] frame = new byte[data.Length + 4];
            frame[0] = (byte)(frame.Count());
            frame[1] = code;

            //содержимое (со 2 по предпоследний байты)
            Array.Copy(data, 0, frame, 2, data.Length);

            //контрольная сумма
            var reverse = code != 1 && code != 2;
            var crc     = Crc16Modbus.CrcCalculate(frame.Take(frame.Length - 2).ToArray(), reverse);

            frame[frame.Length - 2] = crc[0];
            frame[frame.Length - 1] = crc[1];

            return(frame);
        }