解決串口接收數據不完整

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章