串口數據解析遞歸與非遞歸的寫法
阿新 • • 發佈:2017-11-17
++ 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); } }
串口數據解析遞歸與非遞歸的寫法