Example #1
0
        public override ParseResult ParsePackage(ref ArrayList irReceived, ref Frame_Stu ruleinfo, ref int startindex, ref int endindex)
        {
            ruleinfo.dataArray = new ArrayList();
            ArrayList temp = new ArrayList();

            temp.AddRange(irReceived);
            //报文中不包含任何数据段时,最短长度为15字节
            if (irReceived.Count <= 15)
            {
                startindex = 0;
                endindex   = 0;
                return(ParseResult.Unintegrated);
            }
            int indexof68 = 0;

            while (startindex < irReceived.Count)
            {
                //查找起始0x68
                startindex = irReceived.IndexOf((byte)0x68, indexof68);
                if (startindex < 0)
                {
                    return(ParseResult.Error);
                }

                endindex  = startindex;
                indexof68 = startindex;

                if ((byte)irReceived[startindex + 5] != 0x68)
                {
                    irReceived.RemoveRange(0, 1);
                    continue;
                }
                else
                {
                    endindex = startindex + 5;//endindex指向了第二个0x68
                }
                int length = 0;
                length   = Convert.ToInt32((byte)irReceived[startindex + 2]);
                length <<= 6;
                length  |= Convert.ToInt32(((byte)irReceived[startindex + 1]) >> 2);

                //报文收到的不完整      帧起始索引  头  数据长度
                if (irReceived.Count < startindex + 5 + length)
                {
                    return(ParseResult.Unintegrated);
                }
                else
                {
                    endindex = startindex + 5 + length;
                }

                ruleinfo.ctrl = (byte)irReceived[startindex + 6];

                endindex = startindex + 5 + length; //endindex指向了用户数据段的末尾
                endindex = endindex + 2;            //endindex指向了报文末尾的16
                if (irReceived.Count < endindex)
                {
                    return(ParseResult.Unintegrated);
                }

                if ((byte)irReceived[endindex] != 0x16)
                {
                    return(ParseResult.Error);
                }

                byte[] addr = new byte[5];
                addr[0]      = (byte)irReceived[startindex + 7];
                addr[1]      = (byte)irReceived[startindex + 8];
                addr[2]      = (byte)irReceived[startindex + 9];
                addr[3]      = (byte)irReceived[startindex + 10];
                addr[4]      = (byte)irReceived[startindex + 11];
                ruleinfo.afn = (byte)irReceived[startindex + 12];

                Array altemp = irReceived.GetRange(startindex + 6, endindex - startindex - 6 - 1).ToArray(typeof(byte));
                if ((byte)irReceived[endindex - 1] != getCS(altemp))
                {
                    return(ParseResult.Error);
                }

                ruleinfo.dataArray.Clear();
                ruleinfo.dataArray.AddRange(irReceived.GetRange(startindex + 18, (endindex - 2) - (startindex + 18) + 1).ToArray(typeof(byte)));
                return(ParseResult.OK);
            }
            return(ParseResult.Unintegrated);
        }
Example #2
0
 virtual public ParseResult ParsePackage(ref ArrayList irReceived, ref Frame_Stu ruleinfo, ref int startindex, ref int endindex)
 {
     return(ParseResult.OK);
 }