1. 程式人生 > >C#串列埠接收資料-根據特定通訊協議解析

C#串列埠接收資料-根據特定通訊協議解析



 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);//清除第一個位元組,繼續檢測下一個。
                }
            }


            }           


        }