private static void TestZDescribeProcess()
        {
            ZDescribeProcess zDescribeProcess = new ZDescribeProcess();

            zDescribeProcess.LoadDescribesFile("ProtocolDescribe.txt");
            ZBlockDescribe zpd = zDescribeProcess.Lookup(0xc0);
        }
 public static DataBlock CreateDataBlock(ZBlockDescribe zBlockDescribe)
 {
     DataBlock dataBlock = new DataBlock();
     dataBlock.Title = zBlockDescribe.BlockName;
     dataBlock.TitleTips = "0x" + zBlockDescribe.BlockWord.ToString("X");
     for (int i = 0; i < zBlockDescribe.ZParts.Length; i++)
     {
         DataWidget dataWidget = new DataWidget();
         dataWidget.Title = zBlockDescribe.ZParts[i].Name;
         dataWidget.TitleTips = zBlockDescribe.ZParts[i].DataType.ToString();
         dataWidget.TextTips = zBlockDescribe.ZParts[i].ShowType.ToString();
         dataWidget.DataString = "0";
         dataBlock.AddDataWidget(dataWidget);
     }
     dataBlock.SetPartsWidth(100);
     return dataBlock;
 }
        private void Convert()
        {
            dataString = new DataString();
            dataString.BlockWord = byte.Parse(dataWidget1.DataString);

            zBlockDescribe = new ZBlockDescribe();
            zBlockDescribe.BlockName = dataWidget3.DataString;
            zBlockDescribe.BlockWord = byte.Parse(dataWidget1.DataString);

            if (dataWidget2.DataString == "")
            {
                dataString.Data = new string[list.Count];
                dataString.Value = new float[list.Count];

                zBlockDescribe.ZParts = new ZPartDescribe[list.Count];
                //zBlockDescribe.ZPartNum = list.Count;

                for (int i = 0; i < list.Count; i++)
                {
                    zBlockDescribe.ZParts[i].Name = list[i].DataName;
                    zBlockDescribe.ZParts[i].DataType = ConvertType(list[i].DataType);
                    zBlockDescribe.ZParts[i].Index = (byte)i;
                    dataString.Data[i] = list[i].DataString;
                }
            }
            else
            {
                dataString.Data = new string[list.Count + 1];
                dataString.Value = new float[list.Count + 1];

                zBlockDescribe.ZParts = new ZPartDescribe[list.Count + 1];
                //zBlockDescribe.ZPartNum = list.Count + 1;

                dataString.Data[0] = dataWidget2.DataString;

                zBlockDescribe.ZParts[0].DataType = DataTypeEnum.Reserve;
                zBlockDescribe.ZParts[0].Index = 0;
                zBlockDescribe.ZParts[0].Name = "保留位";
                zBlockDescribe.ZParts[0].BlockWord = zBlockDescribe.BlockWord;

                for (int i = 1; i < list.Count + 1; i++)
                {
                    zBlockDescribe.ZParts[i].BlockWord = zBlockDescribe.BlockWord;
                    zBlockDescribe.ZParts[i].Name = list[i-1].DataName;
                    zBlockDescribe.ZParts[i].DataType = ConvertType(list[i-1].DataType);
                    zBlockDescribe.ZParts[i].Index = (byte)i;
                    dataString.Data[i] = list[i-1].DataString;
                }
            }
        }
        void ZProtocolProcessObj_OnReceviceBlock()
        {
            while (ZProtocolProcessObj.BufferBlockNum > 0)
            {
                ZBlock zBlock = ZProtocolProcessObj.FetchBlock();//取出数据
                ZBlockDescribe zBlockDescribe = new ZBlockDescribe();
                try
                {
                    zBlockDescribe = ZDescribeProcessObj.Lookup(zBlock.Word);//查询描述
                    if (zBlockDescribe.BlockWord != 0 && zBlockDescribe.BlockWord == zBlock.Word)
                    {
                        DataString dataString = Converter.GetDataString(zBlock, zBlockDescribe);//格式化数据
                        Converter.UpdateDataBlock(Blocks[zBlock.Word], dataString);//更新显示
                        //附加处理
                        //记录飞行状态数据
                        if (cbFlyRec.Checked == true)
                        {
                            FlyRec(dataString);
                        }
                        //TODO:特定命令字处理
                        //显示消息
                        ShowMessage(ref zBlock);
                    }
                }
                catch
                {
                 //   WriteLine("Undefine Word:0x" + zBlock.Word.ToString("X"));
                }

                try
                {
                    zBlockDescribe = ZDescribeProcessObjMin.Lookup(zBlock.Word);//查询描述
                    if (zBlockDescribe.BlockWord != 0 && zBlockDescribe.BlockWord == zBlock.Word)
                    {
                        DataString dataString = Converter.GetDataString(zBlock, zBlockDescribe);//格式化数据
                        Converter.UpdateDataBlock(BlocksMin[zBlock.Word], dataString);//更新显示

                        switch (dataString.BlockWord)
                        {
                            case 0x5B:
                                dataGraphics1.AddData(dataString.Value[0]);//x位置
                                dataGraphics2.AddData(dataString.Value[1]);//y位置
                                dataGraphics3.AddData(dataString.Value[2]);//高度
                                break;
                            case 0x5C:
                                dataGraphics4.AddData(dataString.Value[0]);//x速度
                                dataGraphics6.AddData(dataString.Value[1]);//y速度
                                dataGraphics10.AddData(dataString.Value[2]);//z速度
                                break;
                            case 0x59:
                                dataGraphics5.AddData(dataString.Value[0]);//俯仰角
                                dataGraphics7.AddData(dataString.Value[1]);//滚转角
                                dataGraphics9.AddData(dataString.Value[2]);//航向角
                                break;
                            case 0x5A:
                                dataGraphics8.AddData(dataString.Value[2]);//航向角速度
                                break;
                            case 0x52:
                                dataGraphicsTwoLine1.AddData(dataString.Value[0], 0);//算法舵量A
                                dataGraphicsTwoLine2.AddData(dataString.Value[1], 0);//算法舵量B
                                dataGraphicsTwoLine3.AddData(dataString.Value[2], 0);//算法舵量C
                                break;
                            case 0x53:
                                dataGraphicsTwoLine4.AddData(dataString.Value[0], 0);//算法舵量D
                                dataGraphicsTwoLine5.AddData(dataString.Value[1], 0);//算法舵量E
                                break;
                            case 0x54:
                                dataGraphicsTwoLine1.AddData(dataString.Value[0], 1);//遥控舵量A
                                dataGraphicsTwoLine2.AddData(dataString.Value[1], 1);//遥控舵量B
                                dataGraphicsTwoLine3.AddData(dataString.Value[2], 1);//遥控舵量C
                                break;
                            case 0x55:
                                dataGraphicsTwoLine4.AddData(dataString.Value[0], 1);//遥控舵量D
                                dataGraphicsTwoLine5.AddData(dataString.Value[1], 1);//遥控舵量E
                                break;
                            default:
                                break;
                        }
                    }
                }
                catch
                {
                   // WriteLine("Undefine Word:0x" + zBlock.Word.ToString("X"));
                }

            }
        }
        public static ZBlock GetZBlock(DataBlock dataBlock, ZBlockDescribe zBlockDescribe)
        {
            ZBlock zBlock = new ZBlock();
            zBlock.Data = new byte[12];
            zBlock.Word = zBlockDescribe.BlockWord;

            int p = 0;
            for (int i = 0; i < zBlockDescribe.ZParts.Length; i++)
            {
                if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.C)//认为显示类型也为C
                {
                    for (int j = 0; j < dataBlock.Parts[i].DataString.Length && j < zBlockDescribe.ZParts[i].CharLength; j++)
                    {
                        zBlock.Data[p] = (byte)dataBlock.Parts[i].DataString[j];
                        p++;
                    }
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.F32)
                {
                    float f = float.Parse(dataBlock.Parts[i].DataString);//TODO:异常处理,取值分析
                    byte[] bs = BitConverter.GetBytes(f);
                    for (int j = 0; j < bs.Length; j++)
                    {
                        zBlock.Data[p] = bs[j];
                        p++;
                    }
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.Reserve)
                {
                    byte b = 0;
                    if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.C)
                    {
                        b = (byte)dataBlock.Parts[i].DataString[0];
                    }
                    else if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.D)
                    {
                        b = byte.Parse(dataBlock.Parts[i].DataString);
                    }
                    else if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.X)
                    {
                        b = byte.Parse(dataBlock.Parts[i].DataString, System.Globalization.NumberStyles.HexNumber);
                    }
                    zBlock.Reserve = b;
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.U8)
                {
                    byte b = 0;
                    if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.C)
                    {
                        b = (byte)dataBlock.Parts[i].DataString[0];
                    }
                    else if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.D)
                    {
                        b = byte.Parse(dataBlock.Parts[i].DataString);
                    }
                    else if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.X)
                    {
                        b = byte.Parse(dataBlock.Parts[i].DataString, System.Globalization.NumberStyles.HexNumber);
                    }
                    zBlock.Data[p] = b;
                    p++;
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.U16)
                {
                    UInt16 u = 0;
                    if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.D)
                    {
                        u = UInt16.Parse(dataBlock.Parts[i].DataString);
                    }
                    else if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.X)
                    {
                        u = UInt16.Parse(dataBlock.Parts[i].DataString, System.Globalization.NumberStyles.HexNumber);
                    }
                    byte[] bs = BitConverter.GetBytes(u);
                    for (int j = 0; j < bs.Length; j++)
                    {
                        zBlock.Data[p] = bs[j];
                        p++;
                    }
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.U32)
                {
                    UInt32 u = 0;
                    if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.D)
                    {
                        u = UInt32.Parse(dataBlock.Parts[i].DataString);
                    }
                    else if (zBlockDescribe.ZParts[i].ShowType == ShowTypeEnum.X)
                    {
                        u = UInt32.Parse(dataBlock.Parts[i].DataString, System.Globalization.NumberStyles.HexNumber);
                    }
                    byte[] bs = BitConverter.GetBytes(u);
                    for (int j = 0; j < bs.Length; j++)
                    {
                        zBlock.Data[p] = bs[j];
                        p++;
                    }
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.S16)//认为其只有十进制显示模式
                {
                    Int16 u = Int16.Parse(dataBlock.Parts[i].DataString);
                    byte[] bs = BitConverter.GetBytes(u);
                    for (int j = 0; j < bs.Length; j++)
                    {
                        zBlock.Data[p] = bs[j];
                        p++;
                    }
                }
                else if (zBlockDescribe.ZParts[i].DataType == DataTypeEnum.S32)//认为其只有十进制显示模式
                {
                    Int32 u = Int32.Parse(dataBlock.Parts[i].DataString);
                    byte[] bs = BitConverter.GetBytes(u);
                    for (int j = 0; j < bs.Length; j++)
                    {
                        zBlock.Data[p] = bs[j];
                        p++;
                    }
                }
            }
            return zBlock;
        }
 public static DataString GetDataString(ZBlock zBlock, ZBlockDescribe zBlockDescribe)
 {
     DataString dataString = CreateDataString(zBlockDescribe);
     int p = 0;
     for (int i = 0; i < zBlockDescribe.ZParts.Length; i++)//根据描述信息及数据,循环完成数据的读取及格式化.
     {
         int I; uint U; float F; string S;
         switch (zBlockDescribe.ZParts[i].DataType)
         {
             case DataTypeEnum.U8:
                 U = zBlock.Data[p]; p += 1; F = U;
                 S = ToStr(U, zBlockDescribe.ZParts[i].ShowType);
                 break;
             case DataTypeEnum.U16:
                 U = BitConverter.ToUInt16(zBlock.Data, p); p += 2; F = U;
                 S = ToStr(U, zBlockDescribe.ZParts[i].ShowType);
                 break;
             case DataTypeEnum.U32:
                 U = BitConverter.ToUInt32(zBlock.Data, p); p += 4; F = U;
                 S = ToStr(U, zBlockDescribe.ZParts[i].ShowType);
                 break;
             case DataTypeEnum.S16:
                 I = BitConverter.ToInt16(zBlock.Data, p); p += 2; F = I;
                 S = ToStr(I, zBlockDescribe.ZParts[i].ShowType);
                 break;
             case DataTypeEnum.S32:
                 I = BitConverter.ToInt32(zBlock.Data, p); p += 4; F = I;
                 S = ToStr(I, zBlockDescribe.ZParts[i].ShowType);
                 break;
             case DataTypeEnum.F32:
                 F = BitConverter.ToSingle(zBlock.Data, p); p += 4;
                 S = ToStr(F, zBlockDescribe.ZParts[i].ShowType);
                 break;
             case DataTypeEnum.C:
                 F = 0;
                 char[] cs = new char[12];
                 int n = 0;
                 for (n = 0; n < zBlockDescribe.ZParts[i].CharLength / 8; n++)
                 {
                     char c = (char)zBlock.Data[n];
                     if (c == 0)
                     {
                         break;
                     }
                     cs[n] = c;
                 }
                 S = new string(cs, 0, n);
                 break;
             case DataTypeEnum.Reserve:
                 U = zBlock.Reserve; F = U;
                 S = ToStr(U, zBlockDescribe.ZParts[i].ShowType);
                 break;
             default:
                 F = 0;
                 S = "";
                 break;
         }
         dataString.Data[i] = S;
         dataString.Value[i] = F;
     }
     return dataString;
 }
 private static DataString CreateDataString(ZBlockDescribe zBlockDescribe)
 {
     DataString dataString = new DataString();
     dataString.BlockWord = zBlockDescribe.BlockWord;
     dataString.Data = new string[zBlockDescribe.ZParts.Length];
     dataString.Value = new float[zBlockDescribe.ZParts.Length];
     return dataString;
 }
        /// <summary>
        /// ����Э��������ļ�
        /// </summary>
        /// <param name="File">�������ļ���·�����ļ���</param>
        /// <returns>�ɹ�����������</returns>
        public int LoadDescribesFile(string File)
        {
            ZPackageDescribes.Clear();//���

            StreamReader SR = new StreamReader(File);//�����ļ�����

            //ѭ����ȡ����
            while (SR.EndOfStream == false)
            {
                string s = SR.ReadLine();//��ȡһ��

                if (s.Length == 0)//���Կ���
                {
                    continue;
                }
                if (s[0] == '#')//����ע����
                {
                    continue;
                }

                char[] c1 = { '$' };
                string[] s1 = s.Split(c1, StringSplitOptions.RemoveEmptyEntries);

                int k = 0;//��¼��ȡ��Part����
                ZBlockDescribe zpd = new ZBlockDescribe();//������Ϣ�ṹ
                zpd.ZParts = new ZPartDescribe[s1.Length-1];//��ʼ��Part����ռ�

                //ѭ������ÿһ��
                for (int i = 0; i < s1.Length; i++)
                {
                    ZPartDescribe z = GetPartInfo(s1[i]);//��������Ϣ
                    if (i == 0)//����ͷ��Ϣ
                    {
                        zpd.BlockWord = z.BlockWord;
                        zpd.BlockName = z.Name;
                    }
                    else//���汣��λ����������Ϣ
                    {
                        z.BlockWord = zpd.BlockWord;
                        z.Index = (byte)k;
                        zpd.ZParts[k] = z;
                        k++;
                    }
                }
                //zpd.ZPartNum = k;//����Part������Ϣ
                ZPackageDescribes.Add(zpd.BlockWord, zpd);//��ӵ��ֵ���
            }
            SR.Close();
            return ZPackageDescribes.Count;
        }