//針對數據協議:head + len + playload + check 類型 private List<byte> buffer = new List<byte>(4096); private void sp_DataReceived(objectsender, EventArgs e) //sp是串口控件 { int n = sp.BytesToRead; byte[] buf = new byte[n]; sp.Read(buf, 0, n); //1.緩存數據 buffer.AddRange(buf); //2.完整性判斷 while (buffer.Count >= 4) //至少包含幀頭(2字節)、長度(1字節)、校驗位(1字節);根據設計不同而不同 { //2.1 查找數據頭 if (buffer[0] == 0x01) //傳輸數據有幀頭,用於判斷 { int len = buffer[2]; if (buffer.Count < len + 4) //數據區尚未接收完整 { break; } //得到完整的數據,復制到ReceiveBytes中進行校驗 byte[] ReceiveBytes = new byte[len + 4]; buffer.CopyTo(0, ReceiveBytes, 0, len + 4); byte jiaoyan; //開始校驗---自定義實現 jiaoyan = this.JY(ReceiveBytes);// if (jiaoyan != ReceiveBytes[len+3]) //校驗失敗,最后一個字節是校驗位 { buffer.RemoveRange(0, len + 4); MessageBox.Show("數據包不正確!"); continue; } buffer.RemoveRange(0, len + 4); ///執行對數據進行處理操作RunReceiveDataCallback(ReceiveBytes); } else //幀頭不正確時,記得清除 { buffer.RemoveAt(0); } } }