C# 解決串口接收數據不完整
1. 使用緩存機制完成:
- 首先通過定義一個成員變量
List<byte> buffer=new List<byte>(4096);
用來存放所有的數據,在接收函數裏,通過buffer.AddRange()
方法不斷將接收到的數據加入到buffer中,並同時對buffer
的數據進行校驗,如果達到一定的長度並且校驗結果正確(校驗方法在發送端和接收端一致),在進行處理。
![image]()
private List<byte> buffer=new List<byte>(4096);
private void SP_DataReceived(object sender,EventArgs e){
int n=sp.BytesToRead; //讀取緩衝區中字節長度
byte[] buf=new byte[n];//創建字節數組buf,用於保存本次從緩衝區讀取的數據
sp.Read(buf,0,0);//把緩衝區中的數據讀到字節數組buf中
buffer.AddRange(buf); //緩存數據 例如發送一幀數據爲:55 AA 02 00 03 01 00 0B,本次接收到的可能是55 AA,下次接收到的是 02 00 03 01 最後一次接收到00 0B 每次接收到的都不一定會是一個完整的幀
//完整性判斷
while(buffer.count>=4) //至少包含幀頭(2字節)、長度(1字節)、校驗位(1字節);根據設計不同而不同
{
if(buffer[0]==0x55) //傳輸數據有幀頭,用於判斷
{
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!=ReceiveByte[len+3]) //校驗失敗,最後一個字節是校驗位
{
buffer.RemoveRange(0,len+4);
MessageBox.Show("數據包不正確!");
continue;
}
buffer.RemoveRange(0,len+4);
///執行其他代碼對數據進行處理
}else //幀頭不爭取時,記得清除
{
buffer.RemoveAt(0);
}
}
}
參考:https://www.cnblogs.com/haofaner/p/3402307.html