//public static event Action<object> CmdParsed;

        public static void ReceiveData(byte[] data, SerialParseFunc serialParseFunc)
        {
            lock (SyncRoot)
            {
                ReadBuffer.AddRange(data);

                ParseCmd(serialParseFunc);
            }
        }
        //public static event Action<object> CmdParsed;

        public static void ReceiveData(byte[] data, SerialParseFunc serialParseFunc)
        {
            lock (SyncRoot)
            {
                ReadBuffer.AddRange(data);

                ParseCmd(serialParseFunc);
                //if (ParseCmd(out cmdInfo, serialParseFunc))
                //{
                //    //OnCmdParsed(cmdInfo);
                //}
            }
        }
示例#3
0
        //public static event Action<object> CmdParsed;

        public static void ReceiveData(byte[] data, SerialParseFunc serialParseFunc)
        {
            lock (SyncRoot)
            {
                // string temp = SerialClass.byteToHexStr(data);

                ReadBuffer.AddRange(data);

                ParseCmd(serialParseFunc);
                ClearBuffer();
                //if (ParseCmd(out cmdInfo, serialParseFunc))
                //{
                //    //OnCmdParsed(cmdInfo);
                //}
            }
        }
        /// <summary>
        /// 解析命令
        /// </summary>
        /// <returns>是否解析出一条正确命令</returns>
        static Boolean ParseCmd(SerialParseFunc serialParseFunc)
        {
            Int32 parsedHeaderIndex;
            Int32 parsingIndex;

            var parseResult = serialParseFunc(ReadBuffer, out parsedHeaderIndex, out parsingIndex);

            Boolean result = false;

            switch (parseResult)
            {
            case CmdParseResult.Fail:
                //清除解析后的数据
                if (parsingIndex > 0)
                {
                    ReadBuffer.RemoveRange(0, parsingIndex);
                }
                break;

            case CmdParseResult.IncompleteCmd:
                //清除协议头之前的数据,加快解析
                if (parsedHeaderIndex > 0)
                {
                    ReadBuffer.RemoveRange(0, parsedHeaderIndex);
                }
                break;

            case CmdParseResult.Ok:
                result = true;
                //清除解析后的数据
                if (parsingIndex > 0)
                {
                    ReadBuffer.RemoveRange(0, parsingIndex);
                }
                break;
            }

            return(result);
        }
        /// <summary>
        /// 解析命令
        /// </summary>
        /// <returns>是否解析出一条正确命令</returns>
        static Boolean ParseCmd(SerialParseFunc serialParseFunc)
        {
            Log.Logger.Debug("开始解析");
            Int32 parsedHeaderIndex;
            Int32 parsingIndex;

            var parseResult = serialParseFunc(ReadBuffer.ToArray(), out parsedHeaderIndex, out parsingIndex);

            Log.Logger.Debug("parseResult:" + parseResult.ToString() + " parsedHeaderIndex:" + parsedHeaderIndex + " parsingIndex:" + parsingIndex);

            Boolean result = false;

            switch (parseResult)
            {
            case CmdParseResult.Fail:
                //清除解析后的数据
                if (parsingIndex > 0)
                {
                    ReadBuffer.RemoveRange(0, parsingIndex);
                    if (ReadBuffer.Count > 0)
                    {
                        for (int i = 0; i < ReadBuffer.Count; i++)
                        {
                            Log.Logger.Debug("解析:" + ReadBuffer[i].ToString());
                        }
                    }
                }
                break;

            case CmdParseResult.IncompleteCmd:
                //清除协议头之前的数据,加快解析
                if (parsedHeaderIndex > 0)
                {
                    ReadBuffer.RemoveRange(0, parsedHeaderIndex);
                    if (ReadBuffer.Count > 0)
                    {
                        for (int i = 0; i < ReadBuffer.Count; i++)
                        {
                            Log.Logger.Debug("解析:" + ReadBuffer[i].ToString());
                        }
                    }
                }
                break;

            case CmdParseResult.Ok:
                result = true;
                //清除解析后的数据
                if (parsingIndex > 0)
                {
                    ReadBuffer.RemoveRange(0, parsingIndex);
                    if (ReadBuffer.Count > 0)
                    {
                        for (int i = 0; i < ReadBuffer.Count; i++)
                        {
                            Log.Logger.Debug("解析:" + ReadBuffer[i].ToString());
                        }
                    }
                }
                break;
            }

            return(result);
        }