用串口接收数据,比如 35 36 34 38 37 2 34 36 8 32 31 36 35 34 3138 32 36 35 ...............
其中 2 ,8 ,3138就是不正确的接收,请问如何剔除呢?
接收程序如下
[code=csharp][/private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int n = serialPort1.BytesToRead;
            byte[] buf = new byte[n];
            received_count += n;
            serialPort1.Read(buf, 0, n);
            builder.Clear();            this.BeginInvoke((EventHandler)(delegate
            {
                foreach (byte b in buf)
                {
                    builder.Append(b.ToString("X2"));
                }
                string[] maxvalue = builder.ToString().Split(new string[] { "FFFF8A","FF", "00AAAA","AA","0"}, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < maxvalue.Length; i++ )
                {
                   
                        textBox3.AppendText(maxvalue[i] + "\r\n");
                        bb = Convert.ToInt32(maxvalue[i], 16);
                        textBox8.AppendText(bb.ToString() + "\r\n");
                        cc = (bb / 10) - 6;
                        if (1 < cc)
                        {                            textBox5.AppendText(cc + "\r\n");
                            series.Points.AddY(cc);
                        }
                    
                  
                }
          }));
        }code]

解决方案 »

  1.   

    如果真的是 干扰数据,那么一定就通不过 CRC 校验,你让他重发就是了
    如果通过了 CRC 校验,那么就应视为正常数据
      

  2.   

    需要注意区分真的干扰数据和误判为干扰数据的正常数据
    正确的处理还是把数据接收和数据解析分离,
    保证不要因为解析异常影响数据接收
    串口类似于tcp,需要进行分包和拼包
      

  3.   

    你的 buf 是 byte[] 的,不可能出现 3138 因为越界溢出了
    经 ToString("X2") 处理后,也不可能出现 2 ,8 因为格式化成3个字节后,不会再是单字节
    要删除根本就不存在的数据,这是为何呢?
      

  4.   

    我写的是在cc中出现的,也就是在textbox5中出现的
      

  5.   

    可能问题出在重入了
    可能本轮数据解析未完成,后一轮数据又来了
    公用buffer未加锁,
    这个时候就会有“脏数据”了
      

  6.   

    打印出 builder.ToString(),我看看
    你是按 new string[] { "FFFF8A","FF", "00AAAA","AA","0"} 切割数组的
    你开列的虽然都是预定的分隔符,但你怎么能保证正文里不会出现他们呢?
    02、08 被你切割成了 2、8,怎么能说是 干扰 呢
    如果 10 也被切割了(16 变成了 1),那还对吗