C# 解決串口接收數據不完整


使 用緩存機制完成。首先通過定義一個成員變量List<byte> buffer = new List<byte> (4096);用來存放所有的數據,在接收函數里,通過buffer.AddRange()方法不斷地將接收到的數據加入到buffer中,並同時對 buffer中的數據進行檢驗,如果達到一定的長度並且校驗結果正確(校驗方法在發送方和接收方一致),再進行處理。具體代碼如下:代碼 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中進行校驗
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);
/////執行其他代碼,對數據進行處理。
}
else //幀頭不正確時,記得清除
{
buffer.RemoveAt(0);
}
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM