码迷,mamicode.com
首页 > 其他好文 > 详细

串口数据解析递归与非递归的写法

时间:2017-11-17 15:02:00      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:roc   数据   oar   一个   over   count   10个   长度   处理   

暂时没有弄明白为什么递归的写法会影响到通讯速度,做一个记录方便以后查阅以及解决吧.


    /// <summary>
    /// 解析数据-递归方式
    /// </summary>
    private void ParseRecursive(List<byte> buffer)
    {
        // 从缓冲中查找帧头一直找到为止
        // 丢弃缓冲前部没有与帧头匹配成功的字节
        while (buffer.Count > 0)
        {
            if (buffer[0] != DEF_HEADER)
            {
                buffer.RemoveAt(0);
            }
            else break;
        }

        // 一个完整数据包至少10个字节
        if (buffer.Count < 10) return;

        // 验证串号
        ushort sn = BitConverter.ToUInt16(buffer.ToArray(), 1);
        if (sn != DEF_SERIAL)
        {
            buffer.RemoveAt(0);
            ParseRecursive(buffer);
            return;
        }

        // 验证长度
        // 无效的长度值
        if (buffer[3] < 1)
        {
            buffer.RemoveAt(0);
            ParseRecursive(buffer);
            return;
        }

        // 验证长度校验
        byte len = buffer[3];
        if (buffer[4] != (byte)~len)
        {
            buffer.RemoveAt(0);
            ParseRecursive(buffer);
            return;
        }

        // 验证帧尾
        if (buffer[len + 8] != DEF_FRAMEND)
        {
            buffer.RemoveAt(0);
            ParseRecursive(buffer);
            return;
        }

        // 验证校验位
        byte bcc = buffer[len + 7];
        byte vbcc = buffer[5];
        for (int i = 6; i < len + 2; i++) vbcc ^= buffer[i];
        if (bcc != vbcc)
        {
            buffer.RemoveAt(0);
            ParseRecursive(buffer);
            return;
        }

        // 数据解析
        byte[] data = new byte[len];
        buffer.CopyTo(5, data, 0, len);
        buffer.RemoveRange(0, len + 9);

        // 处理数据
        Process(data);
    }

    /// <summary>
    /// 解析数据-非递归方式
    /// </summary>
    private void ParseNotRecursive(List<byte> buffer)
    {
        while (buffer.Count > 0)
        {
            // 查找帧头
            if (buffer[0] != DEF_HEADER)
            {
                buffer.RemoveAt(0);
                continue;
            }

            // 一个完整数据包至少10个字节
            if (buffer.Count < 10) return;

            // 验证串号
            ushort sn = BitConverter.ToUInt16(buffer.ToArray(), 1);
            if (sn != DEF_SERIAL)
            {
                buffer.RemoveAt(0);
                continue;
            }

            // 验证长度      
            byte len = buffer[3];
            if (len < 1)                // 长度值无效
            {
                buffer.RemoveAt(0);
                continue;
            }
            if (buffer[4] != (byte)~len)
            {
                buffer.RemoveAt(0);
                continue;
            }

            // 验证帧尾
            if (buffer[len + 8] != DEF_FRAMEND)
            {
                buffer.RemoveAt(0);
                continue;
            }

            // 验证校验位
            byte bcc = buffer[len + 7];
            byte vbcc = buffer[5];
            for (int i = 6; i < len + 2; i++) vbcc ^= buffer[i];
            if (bcc != vbcc)
            {
                buffer.RemoveAt(0);
                continue;
            }

            // 解析数据包完成
            byte[] data = new byte[len];
            buffer.CopyTo(5, data, 0, len);
            buffer.RemoveRange(0, len + 9);

            // 处理数据
            Process(data);
        }
    }

 

串口数据解析递归与非递归的写法

标签:roc   数据   oar   一个   over   count   10个   长度   处理   

原文地址:http://www.cnblogs.com/linxmouse/p/7850972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!