Y..X 2019-07-25 12:53 采纳率: 0%
浏览 1819

C# SerialPort的Datareceive事件触发后,BytesToRead的值有时候为零

下位机每隔0.5秒通过串口传25个字节到上位机,串口接收到数据后处理并用zedgraph控件绘制实时曲线图,程序运行几分钟后,Datareceive事件触发后,BytesToRead的值有时候为0,有时是25,也有时是50,界面刷新有时也不是0.5秒。
接收程序:

        private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                if (mySerialPort.IsOpen)
                {
                    Thread.Sleep(10);
                    int count = mySerialPort.BytesToRead;
                        byte[] data = new byte[count];
                        mySerialPort.Read(data, 0, count);
                        if (data[0] == 0x01 && data[1] == 0x03)
                        {
                            this.Invoke(textChanged, data, count);
                        }
                }
            }
            catch (Exception err)
            {
                throw err;
            }
        }

处理程序:

        textChanged += new UpdateTextEventHandler(ChangeText); 
        private delegate void UpdateTextEventHandler(byte[] buffer,int m);//定义委托
        private event UpdateTextEventHandler textChanged;//定义事件 
        private void ChangeText(byte[] buffer,int m) //事件处理方法
        {
            s1 = "";
            Array.Copy(buffer, 3, float_byte1, 0, 4);
            Array.Copy(buffer, 8, float_byte2, 0, 4);
            Array.Copy(buffer, 13, float_byte3, 0, 4);
            Array.Copy(buffer, 18, float_byte4, 0, 4);
            temperture[0] = BitConverter.ToSingle(float_byte1, 0);
            temperture[1] = BitConverter.ToSingle(float_byte2, 0);
            temperture[2] = BitConverter.ToSingle(float_byte3, 0);
            temperture[3] = BitConverter.ToSingle(float_byte4, 0);
            textBox1.Text = temperture[0].ToString();
            textBox2.Text = temperture[1].ToString();
            textBox3.Text = temperture[2].ToString();
            textBox4.Text = temperture[3].ToString();
            for (int i = 0; i < m; i++)
            {
                s1 += buffer[i].ToString("X2");
                s1 += " ";
            }
            textBox5.Text = s1.ToString();
            if (Curve_Flag == 1)
            {
                i++;
                creatGraph(temperture[j]);
            }


        }

zedgraph绘图:

public void creatGraph(float temp)
        {
            double x = (double)i;
            double y = Convert.ToDouble(temp);
            list.Add(x, y);
            myCurve = zedGraphControl1.GraphPane.AddCurve("", list, Color.Red, SymbolType.None);
            //myCurve.Symbol.Fill = new Fill(Color.Blue);//填充数据点
            zedGraphControl1.AxisChange();//画到zedGraphControl1控件中,此句必加
            zedGraphControl1.Refresh();//重新刷新
        }
  • 写回答

3条回答 默认 最新

  • qq_33487700 2019-07-25 14:14
    关注

    串口读取数据的时候不能加Thread.Sleep(10);
    你加了延迟表明你想丢弃一些数据,这是不对的。

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?