/// <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); } }
/// <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); }
/// <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); }
/// <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); }
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); }