C#串口接收数据-根据特定通信协议解析

来源:互联网 发布:百度软件制作 编辑:程序博客网 时间:2024/06/14 19:33


  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);//清除第一个字节,继续检测下一个。
                }
            }


            }           


        }