예제 #1
0
        /// <summary>
        /// 行字符串转换为结构体
        /// </summary>
        public HexTextOneLine StringToDataStruct(string str)
        {
            HexTextOneLine oneLine = new HexTextOneLine();

            //所有数据的字节集合
            oneLine.allBytes = Converter.MyStringConverter.HexStringToBytes("0x" + str.Substring(1, str.Length - 1));

            //标明数据长度
            oneLine.dataLength = Convert.ToByte("0x" + str.Substring(1, 2), 16);

            //偏移地址
            oneLine.addr = Converter.MyStringConverter.HexStringToUint("0x" + str.Substring(3, 4));

            //实际数据转换成字节,每四个组成一个数据地址,高字节在前
            oneLine.data = Converter.MyStringConverter.HexStringToBytes("0x" + str.Substring(9, (int)(oneLine.dataLength * 2)));

            //数据类型
            oneLine.dataType = (ENUM_HexDATA_TYPE)Convert.ToInt32(str.Substring(7, 2));

            //校验和
            oneLine.checkSum = oneLine.allBytes[oneLine.allBytes.Length - 1];

            //实际计算所得校验和
            oneLine.realCheckSum = 0x00;
            for (int i = 0; i < oneLine.allBytes.Length - 1; i++)
            {
                oneLine.realCheckSum += oneLine.allBytes[i];
            }
            oneLine.realCheckSum = (byte)(0x01 + ~oneLine.realCheckSum);

            return(oneLine);
        }
예제 #2
0
        /// <summary>
        /// 将一行数据转换成string
        /// </summary>
        public string DataStructToString(HexTextOneLine oneLine)
        {
            string str = string.Empty;

            //显示地址是实际地址的2倍
            str = ":";
            //数据高位在前
            for (int i = 0; i < oneLine.allBytes.Length; i++)
            {
                str += oneLine.allBytes[i].ToString("X2");
            }
            return(str);
        }
예제 #3
0
        /// <summary>
        /// 解析某一行字符串
        /// </summary>
        public List <HexParseDataOneAddrStruct> ParseOnRow(string str, int lineNum)
        {
            List <HexParseDataOneAddrStruct> oneRowData = new List <HexParseDataOneAddrStruct>();

            //:10 0030 00 60030000 24030000 60030000 60030000 70
            //:02 0000 04 0005 F5
            //:00 0000 01 FF

            HexTextOneLine oneLine = StringToDataStruct(str);

            //实际数据长度的2倍,之所以不用除法,避免出现奇数导致问题
            int doubleRealDataLength = (str.Length - 3 - 4 - 2 - 2);


            #region  异常
            //数据长度不一致
            if (oneLine.dataLength * 2 != doubleRealDataLength)
            {
                HexParseDataOneAddrStruct dataOne = new HexParseDataOneAddrStruct();
                dataOne.lineNum     = lineNum;
                dataOne.lengthError = true;
                oneRowData.Add(dataOne);
                return(oneRowData);
            }

            //校验不通过
            if (oneLine.checkSum != oneLine.realCheckSum)
            {
                HexParseDataOneAddrStruct dataOne = new HexParseDataOneAddrStruct();
                dataOne.lineNum       = lineNum;
                dataOne.checkSumError = true;
                oneRowData.Add(dataOne);
                return(oneRowData);
            }
            #endregion


            switch (oneLine.dataType)
            {
            case ENUM_HexDATA_TYPE.DATA:
            {
                //实际计算所得地址,每一行最多记录16bytes,4组数据;每组占4个地址,4bytes
                UInt32 realAddr = (m_INHX32_ExtendLinearAddressRecord + m_INHX32_ExtendSegmentAddressRecord + oneLine.addr);
                int    i        = 0;

                //数据高位在前
                for (i = 0; i <= oneLine.data.Length - 4; i += 4)
                {
                    HexParseDataOneAddrStruct oneAddr = new HexParseDataOneAddrStruct();
                    uint tmp = (uint)(oneLine.data[i] << 24) + (uint)(oneLine.data[i + 1] << 16) + (uint)(oneLine.data[i + 2] << 8) + (uint)oneLine.data[i + 3];
                    oneAddr.data = tmp;

                    //线性地址和段地址
                    oneAddr.linearOffset          = m_INHX32_ExtendLinearAddressRecord;
                    oneAddr.beforeIsLinearOffset  = m_LastIsLinearOffset;
                    oneAddr.segmentOffset         = m_INHX32_ExtendSegmentAddressRecord;
                    oneAddr.beforeIsSegmentOffset = m_LastIsSegmentOffset;
                    m_LastIsLinearOffset          = m_LastIsSegmentOffset = false; //清空,下次就知道这次不是线性或者段地址

                    //地址
                    oneAddr.addr = Convert.ToUInt32(oneLine.addr + i);

                    //实际地址由线性地址和段地址以及地址组成
                    oneAddr.realAddr = Convert.ToUInt32(oneAddr.linearOffset + oneAddr.segmentOffset + oneAddr.addr);

                    //最大程序地址,超过地址可能为配置字或者其它
                    if (oneAddr.realAddr > HexParseDataOneAddrStruct.maxProgramAddr)
                    {
                        oneAddr.notProgramFlash = true;         //非程序存储
                    }
                    oneAddr.lineNum = lineNum;
                    oneRowData.Add(oneAddr);
                }
                //对于剩下的非4个字节数据,末尾填充F
                if (i < oneLine.data.Length)
                {
                    HexParseDataOneAddrStruct oneAddr = new HexParseDataOneAddrStruct();

                    uint tmp = 0;      // = (uint)(oneLine.data[i] << 24) + (uint)(oneLine.data[i + 1] << 16) + (uint)(oneLine.data[i + 2] << 8) + (uint)oneLine.data[i + 3];
                    for (int j = i; j < i + 4; j++)
                    {
                        if (j < oneLine.data.Length)
                        {
                            tmp += (uint)oneLine.data[j] << (8 * (4 - (j - i) - 1));
                        }
                        else
                        {
                            tmp += (uint)0xFF << (8 * (4 - (j - i) - 1));
                        }
                    }

                    oneAddr.data = tmp;

                    //线性地址和段地址
                    oneAddr.linearOffset          = m_INHX32_ExtendLinearAddressRecord;
                    oneAddr.beforeIsLinearOffset  = m_LastIsLinearOffset;
                    oneAddr.segmentOffset         = m_INHX32_ExtendSegmentAddressRecord;
                    oneAddr.beforeIsSegmentOffset = m_LastIsSegmentOffset;
                    m_LastIsLinearOffset          = m_LastIsSegmentOffset = false; //清空,下次就知道这次不是线性或者段地址

                    //地址
                    oneAddr.addr = Convert.ToUInt32(oneLine.addr + i);

                    //实际地址由线性地址和段地址以及地址组成
                    oneAddr.realAddr = Convert.ToUInt32(oneAddr.linearOffset + oneAddr.segmentOffset + oneAddr.addr);

                    //最大程序地址,超过地址可能为配置字或者其它
                    if (oneAddr.realAddr > HexParseDataOneAddrStruct.maxProgramAddr)
                    {
                        oneAddr.notProgramFlash = true;         //非程序存储
                    }
                    oneAddr.lineNum = lineNum;
                    oneRowData.Add(oneAddr);
                }
            }
            break;

            case ENUM_HexDATA_TYPE.END:
                m_LastIsLinearOffset = m_LastIsSegmentOffset = false;     //清空,下次就知道这次不是线性或者段地址
                break;

            case ENUM_HexDATA_TYPE.ExtendSegmentAddressRecord:     //段地址,左移4位
            {
                UInt32 segAddr = 0;
                segAddr = Convert.ToUInt32((oneLine.data[0] << 8) + oneLine.data[1]);      //地址高位在前
                m_INHX32_ExtendSegmentAddressRecord = (segAddr << 4);

                m_LastIsSegmentOffset = true;         //下次即知此次为段地址
            }
            break;

            case ENUM_HexDATA_TYPE.ExtendLinearAddressRecord:     //线性地址,左移16位
            {
                UInt32 lineAddr = 0;
                lineAddr = Convert.ToUInt32((oneLine.data[0] << 8) + oneLine.data[1]); //地址高位在前
                m_INHX32_ExtendLinearAddressRecord = (lineAddr << 16);                 //显示地址为实际地址的2倍
                m_LastIsLinearOffset = true;                                           //下次即知此次为线性地址
            }
            break;
            }

            return(oneRowData);
        }