Чтение из последовательного порта и графика в режиме реального времени C# - PullRequest
1 голос
/ 31 января 2020

Я получаю данные от последовательного порта и сохраняю их в буфере. Затем, с непрерывно выполняющимся потоком, я предварительно обрабатываю данные в буфере, строю их и сохраняю в другом буфере. В начале все работает отлично. Но через некоторое время он начинает неправильно сохранять (и отображать) данные. На изображении я использую сигнал tri angular для проверки.

Tri angular сигнал работает нормально

Tri angular сигнал работает плохо

Это код:

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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...