[C#上位机学习]串口发送与接收程序

void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string strData;//用于存取串口的数据
        //readLine()方法在进行读取一行时,只有遇到回车(\r)或者换行符(\n)才会返回读取结果
        strData = serialPort1.ReadExisting();//串口收到的数据
        tb_test.Text = strData;
        serialPort1.DiscardInBuffer();//清空缓冲区数据,等待下次接收
}
使用缓存机制完成。

首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);

用来存放所有的数据,

在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验,

如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。

    //针对数据协议:head + len + playload + check 类型
     private List<byte> buffer = new List<byte>(4096);
     
    private void sp_DataReceived(objectsender, EventArgs e) //sp是串口控件
    {
        int n = sp.BytesToRead;
        byte[] buf = new byte[n];
        sp.Read(buf, 0, n);
     
        //1.缓存数据
        buffer.AddRange(buf);
     
        //2.完整性判断
        while (buffer.Count >= 4) //至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同
        {
            //2.1 查找数据头
            if (buffer[0] == 0x01) //传输数据有帧头,用于判断
            {
                int len = buffer[2];
                
                if (buffer.Count < len + 4) //数据区尚未接收完整
                {
                    break;
                }
     
                //得到完整的数据,复制到ReceiveBytes中进行校验
                byte[] ReceiveBytes = new byte[len + 4];
                buffer.CopyTo(0, ReceiveBytes, 0, len + 4);
     
                byte jiaoyan; //开始校验---自定义实现
                jiaoyan = this.JY(ReceiveBytes);//
                if (jiaoyan != ReceiveBytes[len+3]) //校验失败,最后一个字节是校验位
                {
                    buffer.RemoveRange(0, len + 4);
                    MessageBox.Show("数据包不正确!");
                    continue;
                }
     
                buffer.RemoveRange(0, len + 4);
                  
                ///执行对数据进行处理操作RunReceiveDataCallback(ReceiveBytes);
            }
            else //帧头不正确时,记得清除
            {
                buffer.RemoveAt(0);
            }
        }
    }

    //针对协议类型: head + len +cmd + seq+ playload +check + tail; 
     
    private List<byte> buffer = new List<byte>(4096);
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            { 
                try
                {
                    try
                    {
                        int nCount = serialPort1.BytesToRead;
                        if (nCount == 0)
                        {
                            return;
                        }
                     
                        byte[] btAryBuffer = new byte[nCount];
                        serialPort1.Read(btAryBuffer, 0, nCount);
     
                        //缓存数据
                        buffer.AddRange(btAryBuffer);
     
                        int index = 1;
                        while (buffer.Count>0x07)  //最短协议长度
                        {
                            if (buffer[0] == 0x01)   //协议头
                            {
     
                                if (buffer[index] != 0x03)  //查询协议尾
                                {
     
                                     index++;
     
                                    if (index > buffer.Count)    //没有接受到帧尾 0x03
                                    {
                                        break;              //退出继续接收
     
                                    }
     
                                }
                                else  // 接收到协议尾 得到完整一帧数据
                                {
                                    byte[] ReceiveBytes = new byte[index+1];
                                    buffer.CopyTo(0, ReceiveBytes, 0, index+1);
     
                                    RunReceiveDataCallback(ReceiveBytes);
     
                                    buffer.RemoveRange(0, index);
                                }
     
                            }
                            else
                            {
                                buffer.RemoveAt(0);
     
                            }
                        }            
                    }
                    catch (System.Exception ex)
                    {
     
                    }
                 
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    handerListening = false;
                }
            }

 

posted @ 2022-03-28 01:02  2020年2月1日13点30分  阅读(129)  评论(0)    收藏  举报