Esempio n. 1
0
        private List <byte[]> CreatePackage(UInt16 addr, UInt32 header, UInt32 footer, UInt16 id, UInt16 commandId, byte[] data)
        {
            List <byte[]> packageItems = new List <byte[]>();

            if (data != null)
            {
                List <byte[]> dataItems  = data.Split(SINGLE_PACKAGE_LENGTH, false, 0x00);
                UInt16        packageNum = 1;
                foreach (var item in dataItems)
                {
                    byte[] packageItem = new byte[25 + item.Length];
                    int    position    = 0;
                    // 数据包头[0 - 2]    0xAA8E42    3字节,高字节在前
                    Array.Copy(header.GetBytes(), 1, packageItem, 0, 3);
                    position += 3;
                    //数据包总长度(LEN)[3-4] 2字节,高字节在前
                    Array.Copy(((UInt16)packageItem.Length).GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //设备地址[5 - 6] 2字节	高字节为地址X,低字节为地址Y
                    Array.Copy(addr.GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //数据包识别号[7-8] 2字节,用于识别是哪个设备发出的数据包
                    Array.Copy(id.GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //命令号[9 - 10] 2字节 高字节在前   区分不同的命令
                    Array.Copy(commandId.GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //预留字段[11 - 14] 4字节 默认为0
                    Array.Copy(((UInt32)0).GetBytes(), 0, packageItem, position, 4);
                    position += 4;
                    //总包数[15-16]	2字节 取值范围1到65535	单包命令默认为1
                    Array.Copy(((UInt16)dataItems.Count).GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //当前包序号[17-18] 2字节	取值范围1到65535	单包命令默认为1,序号从1开始计数。
                    Array.Copy(packageNum.GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //命令执行结果[19]   1字节
                    //1 =成功
                    //2 = 忙碌中
                    //3 = 未知命令
                    //4 = 校验错误
                    //5 = 长度错误
                    //6 = 地址错误  MCU反馈命令执行情况
                    packageItem[position] = 0;
                    position += 1;
                    //数据段[20到LEN - 6]
                    //数据段以外的长度为25字节。
                    //可用来保存上位机发给下位机的参数,也可以用来保存下位机返回给上位机的数据。当数据段长度为0时,表示该命令不需要传输数据
                    Array.Copy(item, 0, packageItem, position, item.Length);
                    position += item.Length;
                    //校验码[LEN-5 到LEN-4]	0-65535,高字节在前	采用累加和校验法,将字节序号3到序号(LEN-6)的所有数据相加,取低16位,高8位在前
                    UInt16 checkSum = (UInt16)(packageItem.CheckSumForUInt32(3, packageItem.Length - 6) & 0xFFFF);
                    Array.Copy(checkSum.GetBytes(), 0, packageItem, position, 2);
                    position += 2;
                    //数据包尾[LEN-3到LEN-1]	0x5571BD	3字节,高字节在前
                    Array.Copy(footer.GetBytes(), 1, packageItem, position, 3);
                    position += 2;
                    packageItems.Add(packageItem);
                    packageNum++;
                }
            }
            else
            {
                byte[] packageItem = new byte[25];
                int    position    = 0;
                // 数据包头[0 - 2]    0xAA8E42    3字节,高字节在前
                Array.Copy(header.GetBytes(), 1, packageItem, 0, 3);
                position += 3;
                //数据包总长度(LEN)[3-4] 2字节,高字节在前
                Array.Copy(((UInt16)packageItem.Length).GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //设备地址[5 - 6] 2字节	高字节为地址X,低字节为地址Y
                Array.Copy(addr.GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //数据包识别号[7-8] 2字节,用于识别是哪个设备发出的数据包
                Array.Copy(id.GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //命令号[9 - 10] 2字节 高字节在前   区分不同的命令
                Array.Copy(commandId.GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //预留字段[11 - 14] 4字节 默认为0
                Array.Copy(((UInt32)0).GetBytes(), 0, packageItem, position, 4);
                position += 4;
                //总包数[15-16]	2字节 取值范围1到65535	单包命令默认为1
                Array.Copy(((UInt16)1).GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //当前包序号[17-18] 2字节	取值范围1到65535	单包命令默认为1,序号从1开始计数。
                Array.Copy(((UInt16)(1)).GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //命令执行结果[19]   1字节
                //1 =成功
                //2 = 忙碌中
                //3 = 未知命令
                //4 = 校验错误
                //5 = 长度错误
                //6 = 地址错误  MCU反馈命令执行情况
                packageItem[position] = 1;
                position += 1;
                //校验码[LEN-5 到LEN-4]	0-65535,高字节在前	采用累加和校验法,将字节序号3到序号(LEN-6)的所有数据相加,取低16位,高8位在前
                UInt16 checkSum = packageItem.CheckSumForUInt16(3, packageItem.Length - 6);
                Array.Copy(checkSum.GetBytes(), 0, packageItem, position, 2);
                position += 2;
                //数据包尾[LEN-3到LEN-1]	0x5571BD	3字节,高字节在前
                Array.Copy(footer.GetBytes(), 1, packageItem, position, 3);
                position += 2;
                packageItems.Add(packageItem);
            }
            return(packageItems);
        }
Esempio n. 2
0
 /// <summary>
 /// Writes uint16 data into internal buffer.
 /// </summary>
 /// <param name="data">uint16 data to write.</param>
 protected void Write(UInt16 data)
 {
     this.Write(data.GetBytes());
 }
 /// <summary>
 /// <para>Изменить порядок байт</para>
 /// </summary>
 /// <param name="value">Исходное значение</param>
 /// <returns>Результируюущее значение</returns>
 public static UInt16 Swap(this UInt16 value)
 {
     return(LoadUInt16(value.GetBytes(true), 0, false));
 }
Esempio n. 4
0
 public BinaryWriter Write(UInt16 value)
 {
     byteList.AddRange(value.GetBytes());
     return(this);
 }