1. 程式人生 > >串口數據解析遞歸與非遞歸的寫法

串口數據解析遞歸與非遞歸的寫法

++ oid range ria void arr sum 匹配 for

暫時沒有弄明白為什麽遞歸的寫法會影響到通訊速度,做一個記錄方便以後查閱以及解決吧.


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

串口數據解析遞歸與非遞歸的寫法