从串行端口读取并绘制实时C#

问题描述 投票:1回答:1

我从串行端口接收数据,并将其保存在缓冲区中。然后,使用一个连续执行的线程,对缓冲区中的数据进行预处理,将其绘制出来并将其保存在另一个缓冲区中。刚开始时,它运行完美。但是一段时间之后,它开始错误地保存(绘制)数据。在图像中,我使用三角信号进行证明。

Triangular signal working fine

Triangular signal working badly

这是代码:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // Leo los datos recibidos y los guardo en data
        SerialPort port = (SerialPort)sender;
        int largo = port.BytesToRead;
        byte[] data = new byte[largo];
        port.Read(data, 0, largo);
        datos.AddRange(data);
    }

    public void ejecutarThread()
    {
        t = new Thread(() =>
        {
            while (true)
            {
                lock (lockMe)
                {
                    procesarDatos();
                }

            }
        });
        t.Priority = ThreadPriority.Highest;
        t.Start();


    }

    // Preproceso los datos guardados en la lista datos, los agrego a otra lista separados por canal y los grafico
    private void procesarDatos()
    {
        int puntosAGraficar = Convert.ToInt32(numAGraficar.Value);

        // Me guardo la cantidad de datos leidos hasta el momento
        Int32 esto = leido;
        Int32 cantDatosActual = Convert.ToInt32(datos.Count);
        try {
            adquirirSenal(adquirir);
        }
        catch (Exception e)
        {
            //MessageBox.Show("Aca la quedó");
        }
    }

    private void adquirirSenal(bool adquirir)
    {
        int puntosAGraficar = Convert.ToInt32(numAGraficar.Value);

        // Me guardo la cantidad de datos leidos hasta el momento
        Int32 esto = leido;
        Int32 cantDatosActual = Convert.ToInt32(datos.Count);
        for (Int32 i = esto; i < cantDatosActual; i++)
        {
            // Aumento uno más porque tomo a los datos de a dos (parte baja y alta)
            i = i + 1;
            // Los convierto de byte a BitArray para poder operar
            bitH = new BitArray(new byte[] { datos[i - 1] });
            bitL = new BitArray(new byte[] { datos[i] });


            int check = chequeoCanal(bitH, bitL);
            // Si es canal 1
            if (check == 0) 
            {
                bitH[7] = false;
                IsCanal1 = true;
                contadorMuestras1 = contadorMuestras1 + 1;
            }
            // Si es canal 2
            else if (check == 1)
            {
                IsCanal1 = false;
                contadorMuestras2 = contadorMuestras2 + 1;
            }

            // Intercambio el bit 7 de la parte baja por el 2 de la parte alta
            bool bitAux = bitH[2];
            bitH[2] = bitL[7];
            bitL[7] = bitAux;

            // Lo convierto a un BitArray de 16
            BitArray total = from2_8BitArrayTo1_16BitArray(bitH, bitL); 

            //Lo paso a entero
            int val = 0;
            val = getIntFromBitArray(total);

            // Lo guardo en el canal correspondiente y lo dibujo    
            // Me fijo qué canal es segun protocolo
            if (IsCanal1)
            {
                // Si la opcion es adquirir, me guardo los datos y luego dibujo. Sino, simplemente dibujo
                if (adquirir)
                    guardarDatoEnLista(canal1, val);


                // Grafico cada puntosAGraficar puntos para que sea en tiempo real
                if ((contadorMuestras1 >= puntosAGraficar))
                {
                    contadorMuestras1 = 0;
                    if (listaPuntos1.Count >= 300)
                        listaPuntos1.Clear();
                    contadorAcumulador1++;
                    listaPuntos1.Add(listaPuntos1.Count, Convert.ToDouble(val));
                    if (contadorAcumulador1 >= 3)
                    {
                        zedGraph1.Refresh();
                        contadorAcumulador1 = 0;
                    }

                }


            }
            else if (!IsCanal1)
            {
                // Si la opcion es adquirir, me guardo los datos y luego dibujo. Sino, simplemente dibujo
                if (adquirir)
                    guardarDatoEnLista(canal2, val);

                // Grafico cada puntosAGraficar puntos para que sea en tiempo real
                if ((contadorMuestras2 >= puntosAGraficar))
                {
                    contadorMuestras2 = 0;
                    if (listaPuntos2.Count >= 300)
                        listaPuntos2.Clear();
                    contadorAcumulador2++;

                    listaPuntos2.Add(listaPuntos2.Count, Convert.ToDouble(val));
                    if (contadorAcumulador2 >= 3)
                    {
                        zedGraph2.Refresh();
                        contadorAcumulador2 = 0;
                    }
                }
            }
            leido = leido + 2;
        }
    }
c# plot serial-port real-time zedgraph
1个回答
0
投票

您没有正确接地

    没有正确引用您的ADC。
  • 我遇到了类似的问题,因为我正在测量外部供电的设备,因此电池实际上并未接地。
  • © www.soinside.com 2019 - 2024. All rights reserved.