我用的是MUDOBS协议,采集下位机两个通道的模拟量-500mV~+500mV,数据能采集上来(开机textbox1和textbox1中的数据分别是2.09mV、1.85mV),我在第一个通道输入标准10mV的信号后,应在textbox1中显示10mV的值,但是,数据在textbox2和textbox1文本框中数据都在变化,而且textbox1中的数据变的更大,两个通道的数据不断的变化,不稳定。(第一通道输入10mV值后,的显示值分别是textbox1.text=56.18mV,textbox1.text=13.82mv)
   private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (ReceiveEventFlag) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环            try
            {
                Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。                 int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致   
                byte[] buff1 = new byte[n];
                received_count += n;//增加接收计数
                //serialPort1.ReceivedBytesThreshold = 9;
                serialPort1.Read(buff1, 0, n);//读取缓冲数据                //TimeSpan th = new TimeSpan(0, 0, 0, 50);//时间间隔
                //Thread.Sleep(th);
                bool data_1_catched = false;//缓存记录数据是否捕获到
                //1.缓存数据  
                buffer.AddRange(buff1);
                //完整性判断
                byte[] ReceiveBytes = new byte[n-2];
             
                while (buffer.Count >= 4)
                {
                    if (buffer[0] == Tx_ML[0]&&buffer[1] == Tx_ML[1])
                    {
                        int len = buffer[2];
                        if (buffer.Count<len+4)
                        {
                            break;
                        }
                       
                        buffer.CopyTo(0, ReceiveBytes, 0, len +3);
                       byte [] jiaoyan =new byte [n];
                     
                       jiaoyan = Scoft.Bclas.ClasCRC.CRC16_C(ReceiveBytes);
                    
                        byte[] byjy = new byte[ReceiveBytes.Length+jiaoyan.Length];
                        Array.Copy(ReceiveBytes, 0, byjy, 0, ReceiveBytes.Length);
                        Array.Copy(jiaoyan, 0, byjy, ReceiveBytes.Length, jiaoyan.Length);
                      
                       if (buffer[5] != jiaoyan[0] && buffer[6] != jiaoyan[1])
                       {
                           buffer.RemoveRange(0, len + 5);
                           continue;
                       }
                       EDA19017_Mg1_Llimit = Convert.ToUInt32(ReceiveBytes[3].ToString("X2") + ReceiveBytes[4].ToString("X2"), 16);
                       buffer.RemoveRange(0, 7);
                    }
                    else
                    {
                        buffer.RemoveAt(0);
                    }
                
                }
                // EDA19017_Mg1_Llimit = Convert.ToUInt32((Scoft.Bclas.ClasCRC.ByteToString(buff1)).Substring(6, 4), 16);
                //buffer.RemoveRange(0, buff1.Length);
                data_1_catched = true;
                builderk.Remove(0, builderk.Length);//清除字符串构造器的内容
                if (data_1_catched)
                {
                   
                    this.Invoke((EventHandler)
                        (delegate
                        {
                           
                            if (E9060_K1KZ == 1)
                            {
                                this.textBox1.Clear();
                                this.textBox1.Text = Convert.ToString(Scoft.Bclas.ClasCRC.GetSiSheWuRuNumber(Bclas.ClasCRC.L_ineartn(EDA9017_Rge1_Ulimit, EDA9017_Rge1_Llimit, EDA9017_Nf1_Ulimit, EDA9017_Nf1_Llimit, EDA19017_Mg1_Llimit), 2)) + "\r\n";                                E9060_K1KZ = 2;
                                //return;                            }
                            else if (E9060_K1KZ == 2)
                            {
                                this.textBox2.Clear();
                                this.textBox2.Text = Convert.ToString(Scoft.Bclas.ClasCRC.GetSiSheWuRuNumber(Bclas.ClasCRC.L_ineartn(EDA9017_Rge1_Ulimit, EDA9017_Rge1_Llimit, EDA9017_Nf1_Ulimit, EDA9017_Nf1_Llimit, EDA19017_Mg1_Llimit), 2))+"\r\n";
                                E9060_K1KZ = 1;
                                //return;
                            }                        }));
                }                builderk.Remove(0, builderk.Length);//清除字符串构造器的内容
                serialPort1.DiscardInBuffer();
                ReceiveEventFlag = true;
            }
            finally
            {                Listening = false;//我用完了,ui可以关闭串口了。 
                //serialPort1.DataReceived -= new System.IO.Ports.SerialDataReceivedEventHandler(comm1_DataReceived);
                received_count = 0;
                  
            }        }