График в реальном времени от датчика Arduino последовательных данных работает слишком медленно - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь сделать приложение EEG, оно получает данные из arduino в виде строки и обновляет диаграмму вместе с ней ... У меня проблема в том, что программа на компьютере работает слишком медленно, и он отстает от данных реального времени на Arduino ... код, который я использую для этого:

            SerialPort sData = sender as SerialPort;
            String recvdata = sData.ReadLine();
            //LOG.BeginInvoke((MethodInvoker)delegate { LOG.AppendText("Received: " + recvdata); });

            double data;
            Double.TryParse(recvdata, out data);
            this.Invoke((MethodInvoker)delegate { updatechart(new medicion("asd", tag, data)); });
            tag = null;

программа медленная, скорее всего, потому что вызов, я не могу обновить диаграмму с это потому, что он выдает исключение, что программа пытается получить доступ к диаграмме из другого потока.

когда я комментирую таблицу обновлений, программа работает очень быстро ... на другой ноте, я загружаю тесты из .txt файлов, и это происходит очень быстро, потому что у меня нет вызова.

                       chart1.Series["Series1"].Points.Clear();
                        //==recorded.Clear(); // borra lo que haya
                        using (StreamReader sr = File.OpenText(openFileDialog1.FileName))
                        {
                            string reading = "";
                            while ((reading = sr.ReadLine()) != null)
                            {
                                string[] datos = reading.Split(',');
                                double data;
                                Double.TryParse(datos[0], out data);
                                updatechart(new medicion(datos[0], datos[1], data));
                            }
                        }

У кого-нибудь есть идеи по поводу другого варианта, который я мог бы использовать?

edit: Solved, как сказал Джоэл, я сгруппировал показания в списке и после прочтения нескольких обновил таблицу со всеми из них, сделав меньше вызовов для вызова.

   List<medicion> mediciones = new List<medicion>();
        SerialPort sData = sender as SerialPort;
        String recvdata;
        double data;

        while (sData.BytesToRead >= 5)  
        {
            recvdata = sData.ReadLine();
            if(Double.TryParse(recvdata, out data))
            {
                mediciones.Add(new medicion(recvdata, tag, data));
                tag = null;
            }

        }
            //LOG.BeginInvoke((MethodInvoker)delegate { 
              LOG.AppendText("Received: " + recvdata); });

     this.Invoke((MethodInvoker)delegate { updatechart(mediciones); });
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...