C#串列埠接收資料-根據特定通訊協議解析
阿新 • • 發佈:2019-02-08
string strs3 = null;
//接收資料並顯示函式:可用:測試的接收資料為:0x01 0x02(鎮頭) 0x02(長度) 0x03(幀尾、即校驗位) 0x34 0x05(資料):這是硬體傳送過來的測試資料
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)//串列埠資料接收事件
{
int n = mySerialPort.BytesToRead;//獲取接收緩衝區讀取的位元組數;
byte[] buf = new byte[n];//建立n個位元組的快取;
mySerialPort.Read(buf, 0, n);//讀取資料儲存到buffer.
byte[] ReceiveByte = new byte[256];//建立接收資料處理的buffer。
buffer.AddRange(buf);//快取資料
//完整性判斷
while (buffer.Count >= 4)
{
if (buffer[0] == 0x01)//檢測針頭
{
int len = buffer[2];//拿到接收資料的長度
if (buffer.Count < len + 4)
{
break;
}
buffer.CopyTo(0, ReceiveByte, 0, len + 4);//將接受的資料儲存到ReceiveByte位元組數組裡面
byte jiaoyan;
jiaoyan = 0x03;//設定校驗位
if (jiaoyan != ReceiveByte[3])
{
buffer.RemoveRange(0,len + 4);
continue;
}
buffer.RemoveRange(0, len + 4);////跳出迴圈了
//開始處理資料
DataProcess()
{ strs3 = ReceiveByte[4].ToString();
this.Dispatcher.BeginInvoke(new Action(() => txtBox1.Text = strs3));
}
}
else //幀頭不正確時,記得清除
{
buffer.RemoveAt(0);//清除第一個位元組,繼續檢測下一個。
}
}
}
}