Ejemplo n.º 1
0
        /// <summary>
        /// AddrDataListClass复制
        /// dataList为源
        /// copyDataList为目标,保存复制结果
        /// </summary>
        public void AddrDataListClassCopy(ref DataSource.AddrDataListClass dataList, ref DataSource.AddrDataListClass copyDataList)
        {
            if (dataList == null)
            {
                copyDataList = null;
            }

            if (copyDataList == null)
            {
                copyDataList = new DataSource.AddrDataListClass();
            }
            else
            {
                copyDataList.AddrDataCollection.Clear();
            }

            for (int i = 0; i < dataList.AddrDataCollection.Count; i++)
            {
                DataSource.AddrData oneData = new DataSource.AddrData();
                oneData.No   = dataList.AddrDataCollection[i].No;
                oneData.Addr = dataList.AddrDataCollection[i].Addr;
                oneData.BeforeIsLinearOffset  = dataList.AddrDataCollection[i].BeforeIsLinearOffset;
                oneData.BeforeIsSegmentOffset = dataList.AddrDataCollection[i].BeforeIsSegmentOffset;
                oneData.LinearOffset          = dataList.AddrDataCollection[i].LinearOffset;
                oneData.SegmentOffset         = dataList.AddrDataCollection[i].SegmentOffset;
                oneData.RealAddr      = dataList.AddrDataCollection[i].RealAddr;
                oneData.Data          = dataList.AddrDataCollection[i].Data;
                oneData.LineNum       = dataList.AddrDataCollection[i].LineNum;
                oneData.Remark        = dataList.AddrDataCollection[i].Remark;
                oneData.IsInsert      = dataList.AddrDataCollection[i].IsInsert;
                oneData.WarnningColor = dataList.AddrDataCollection[i].WarnningColor;
                copyDataList.AddrDataCollection.Add(oneData);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 插入一行地址
        /// 本身没有记录这一行
        /// </summary>
        private DataSource.AddrData InsertOneAddrData(uint realaddr)
        {
            DataSource.AddrData addrDataTmp = new DataSource.AddrData();
            addrDataTmp.notProgramAddr = false;
            addrDataTmp.No             = Convert.ToInt32(realaddr / 2);
            addrDataTmp.RealAddr       = realaddr;
            addrDataTmp.Data           = 0x00ffffff;
            addrDataTmp.LineNum        = -1; //默认不能为0,否则后面可能会被当做第一行的数据
            addrDataTmp.Remark         = "Hex无,插入FFFFFF";
            addrDataTmp.IsInsert       = true;
            addrDataTmp.WarnningColor  = System.Windows.Media.Brushes.LightGray;

            return(addrDataTmp);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 打包一行地址
        /// </summary>
        private DataSource.AddrData PacakOneAddrData(NXPHexParse.HexParseDataOneAddrStruct oneAddr)
        {
            DataSource.AddrData addrDataTmp = new DataSource.AddrData();
            addrDataTmp.notProgramAddr        = oneAddr.notProgramFlash; //非程序存储
            addrDataTmp.No                    = Convert.ToInt32(oneAddr.realAddr / 2);
            addrDataTmp.BeforeIsLinearOffset  = oneAddr.beforeIsLinearOffset;
            addrDataTmp.BeforeIsSegmentOffset = oneAddr.beforeIsSegmentOffset;
            addrDataTmp.LinearOffset          = oneAddr.linearOffset;
            addrDataTmp.SegmentOffset         = oneAddr.segmentOffset;
            addrDataTmp.Addr                  = oneAddr.addr;
            addrDataTmp.RealAddr              = oneAddr.realAddr;
            addrDataTmp.Data                  = oneAddr.data;
            addrDataTmp.LineNum               = oneAddr.lineNum;
            addrDataTmp.Remark                = "";
            addrDataTmp.IsInsert              = false;
            addrDataTmp.WarnningColor         = System.Windows.Media.Brushes.Transparent;

            return(addrDataTmp);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 打包一个指令字数据
        /// 地址为实际地址-0x800000,否则地址会超过24位长度
        /// </summary>
        public byte[] CanDataPackage(DataSource.AddrData oneAddrData)
        {
            byte[] dataTmp = new byte[8];

            //具体内容
            dataTmp[0] = (byte)CmdType.Data;
            //1-2为地址,高字节在前,1为高位地址,2为低16位的高位地址,3为低16为的低位地址
            dataTmp[1] = Convert.ToByte(((oneAddrData.RealAddr - 0x800000) >> 16) & 0xff); //页号
            dataTmp[2] = Convert.ToByte(((oneAddrData.RealAddr - 0x800000) >> 8) & 0xff);  //高8位
            dataTmp[3] = Convert.ToByte((oneAddrData.RealAddr - 0x800000) & 0xff);

            //6 7 8 9 4bytes为实际数据
            //高字节在前,低字节在后
            dataTmp[4] = Convert.ToByte(((oneAddrData.Data) >> 24) & 0xff);
            dataTmp[5] = Convert.ToByte(((oneAddrData.Data) >> 16) & 0xff); //页号
            dataTmp[6] = Convert.ToByte(((oneAddrData.Data) >> 8) & 0xff);  //高8位
            dataTmp[7] = Convert.ToByte((oneAddrData.Data) & 0xff);

            return(dataTmp);
        }
Ejemplo n.º 5
0
        void UserFlash_WriteData(uint addr, uint[] data, uint length)
        {
            uint[] dataTmp = new uint[2];

            for (int i = 0; i < length; i += 2)
            {
                //数组偶数位为指令字高16位(高8位为虚拟字节,仅低8位有效),奇数位为指令字低16位
                //每个指令字存入一个实际16位数据,高8位为0
                dataTmp[0] = data[i];
                dataTmp[1] = data[i + 1];
                //每次写入2个指令字,偏移8个地址,每4个地址表示一个指令字
                DataSource.AddrData oneData1 = new DataSource.AddrData();
                oneData1.No       = test_AllAddrData.AddrDataCollection.Count;
                oneData1.RealAddr = addr + (uint)i;
                oneData1.Data     = dataTmp[i];
                test_AllAddrData.AddrDataCollection.Add(oneData1);

                DataSource.AddrData oneData2 = new DataSource.AddrData();
                oneData2.No       = test_AllAddrData.AddrDataCollection.Count;
                oneData2.RealAddr = addr + (uint)(i + 8);
                oneData2.Data     = dataTmp[i + 1];
                test_AllAddrData.AddrDataCollection.Add(oneData2);
            }
        }
        /// <summary>
        /// 数据记录
        /// </summary>
        private void DataParse(int insertAfter, int dataLength, uint lineOffset, uint offset, uint dataType, byte[] data)
        {
            lbDataLengthMsg.Content = "";
            byte[] allDataWithoutCheckSum = new byte[4 + dataLength];
            allDataWithoutCheckSum[0] = Convert.ToByte(dataLength);
            allDataWithoutCheckSum[1] = Convert.ToByte((offset >> 8) & 0xff);
            allDataWithoutCheckSum[2] = Convert.ToByte(offset & 0xff);
            allDataWithoutCheckSum[3] = Convert.ToByte(dataType & 0xff);
            for (int i = 4; i < data.Length + 4; i++)
            {
                allDataWithoutCheckSum[i] = data[i - 4];
            }

            //校验和
            byte realCheckSum = 0x00;

            for (int i = 0; i < allDataWithoutCheckSum.Length; i++)
            {
                realCheckSum += allDataWithoutCheckSum[i];
            }
            realCheckSum = (byte)(0x01 + ~realCheckSum);

            string str = string.Empty;

            //普通数据高位在后,只有地址数据才是高位在前
            for (int i = 0; i < data.Length; i++)
            {
                str += data[i].ToString("X2");
            }


            //显示总的字符串
            tbShowLineData.Text = ":" + dataLength.ToString("X2") + " " + offset.ToString("X4") + " " + dataType.ToString("X2") + " "
                                  + str + " " + realCheckSum.ToString("X2");

            string allText = tbShowLineData.Text.Replace(" ", "");

            //解析显示Hex
            #region 解析显示到ListView
            m_TmpDataList.AddrDataCollection.Clear();
            List <MicrochipHexParse.HexParseDataOneAddrStruct> addStructList = m_HexParse.ParseOnRow(allText, insertAfter + 1);

            uint count = 0;
            for (int i = 0; i < addStructList.Count; i++)
            {
                if (addStructList[i].lineNum == insertAfter + 1)
                {
                    DataSource.AddrData addrData = new DataSource.AddrData();
                    addrData.No       = m_TmpDataList.AddrDataCollection.Count;
                    addrData.RealAddr = tbReadAddr.CurrentValue + count;
                    count            += 2;

                    addrData.Data    = addStructList[i].data;
                    addrData.LineNum = addStructList[i].lineNum;
                    if (addStructList[i].checkSumError)
                    {
                        addrData.Remark        = "CheckSum Error ";
                        addrData.WarnningColor = System.Windows.Media.Brushes.LightCyan;
                    }
                    if (addStructList[i].lengthError)
                    {
                        addrData.Remark       += "Length Error";
                        addrData.WarnningColor = System.Windows.Media.Brushes.LightPink;
                    }

                    m_TmpDataList.AddrDataCollection.Add(addrData);
                }
            }
            #endregion

            btnConfirm.IsEnabled = true;
        }
        /// <summary>
        /// 选择Hex文件,并解析
        /// </summary>
        /// <param name="dataList"></param>
        /// <param name="searchDataList"></param>
        /// <returns>返回文件名</returns>
        private string ConvertHexString(ref DataSource.AddrDataListClass dataList, ref DataSource.AddrDataListClass searchDataList, string filenameStr = null)
        {
            string filename = string.Empty;

            if (string.IsNullOrEmpty(filenameStr))
            {
                OpenFileDialog opfDialog = new OpenFileDialog();
                opfDialog.InitialDirectory = Directory.GetCurrentDirectory().ToString();
                opfDialog.Filter           = "(*.hex)|*.hex|All files(*.*)|*.*";
                if (opfDialog.ShowDialog().Value)
                {
                    filename = opfDialog.FileName;
                }
            }
            else
            {
                filename = filenameStr;
            }

            if (string.IsNullOrEmpty(filename))
            {
                return(filename);
            }

            #region 根据文件处理hex
            //读取数据
            string[] allLines = File.ReadAllLines(filename);

            SpecialFunctions.HexParse.MicrochipHexParse microchipHexParse = new SpecialFunctions.HexParse.MicrochipHexParse();

            List <SpecialFunctions.HexParse.MicrochipHexParse.HexParseDataOneAddrStruct> lsDataList = microchipHexParse.GetDataFromMicrochipINHX32(ref allLines);

            dataList.AddrDataCollection.Clear(); //清除原来的数据
            searchDataList.AddrDataCollection.Clear();

            //逐步增加,填充省略的地址
            Int32 fillAddr = 0;

            for (int i = 0; i < lsDataList.Count; i++)
            {
                //其中有跳过的地址,补充进入
                if (fillAddr < lsDataList[i].addr)
                {
                    #region 补全缺失地址为0xffffff
                    //补充跳过的地址为ffffff
                    //实际地址为i*2,从i*2开始,到包含的地址结束,填充地址
                    //地址仅为偶数,所以步长为2
                    for (int t = fillAddr; t < lsDataList[i].addr; t += 2)
                    {
                        DataSource.AddrData addrData1 = new DataSource.AddrData();
                        addrData1.IsInsert      = true;
                        addrData1.No            = t / 2;
                        addrData1.RealAddr      = Convert.ToUInt32(t);
                        addrData1.Data          = 0x00ffffff;
                        addrData1.Remark        = "Hex无,插入FFFFFF";
                        addrData1.WarnningColor = System.Windows.Media.Brushes.LightGray;
                        dataList.AddrDataCollection.Add(addrData1);
                        searchDataList.AddrDataCollection.Add(addrData1);
                    }
                    #endregion
                    //自身
                    DataSource.AddrData addrData2 = new DataSource.AddrData();
                    addrData2.No       = Convert.ToInt32(lsDataList[i].addr / 2);
                    addrData2.RealAddr = Convert.ToUInt32(lsDataList[i].addr);
                    addrData2.Data     = lsDataList[i].data;
                    addrData2.LineNum  = lsDataList[i].lineNum;
                    //addrData2.WarnningColor = System.Windows.Media.Brushes.LightGreen;
                    dataList.AddrDataCollection.Add(addrData2);
                    searchDataList.AddrDataCollection.Add(addrData2);
                }
                else
                {
                    DataSource.AddrData addrData = new DataSource.AddrData();
                    addrData.No       = Convert.ToInt32(fillAddr / 2);
                    addrData.RealAddr = lsDataList[i].addr;
                    addrData.Data     = lsDataList[i].data;
                    addrData.LineNum  = lsDataList[i].lineNum;
                    //addrData.WarnningColor = System.Windows.Media.Brushes.LightGreen;
                    dataList.AddrDataCollection.Add(addrData);
                    searchDataList.AddrDataCollection.Add(addrData);
                }
                fillAddr = Convert.ToInt32(lsDataList[i].addr + 2);
            }

            #endregion


            return(filename);
        }