BlockingCollection для чтения данных из последовательного порта и отображения в режиме реального времени - PullRequest
0 голосов
/ 09 марта 2019

У меня есть 3 класса:

  • Датчик: непрерывно считывает данные с последовательного порта и анализирует их.Когда данные анализируются, добавляет их в blockingCollection

  • DataProcessing: получает данные из blockingCollecion и обрабатывает их.

  • DisplayDataForm: отображает обработанные данные

Как я могу убедиться, что DataProcessing работает непрерывно, но не блокируется, и когда поступают новые данные и обрабатывается ихотображается в форме?

class Sensor
{
    public BlockingCollection<double[]> _bufferTimeSeriesData;

    public void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        byte[] buffer = new byte[_serialPort1.BytesToRead];
        lock (buffer)
        {
            _serialPort1.Read(buffer, 0, buffer.Length);

            double[] samplesAtTimeT;
            for (int i = 0; i < buffer.Length; i++)
            {
                samplesAtTimeT = _BinaryStreamConverter.interpretBinaryStream(buffer[i]);
                if (samplesAtTimeT != null)
                    _bufferTimeSeriesData.Add(samplesAtTimeT); //This is the BlockingCollection
            }
            _bufferTimeSeriesData.CompleteAdding();
        }
    }
}

class DataProcessing
{
    public void ProcessData()
    {
        Task.Run(() =>
            {
                while (Globals.Sensor._bufferTimeSeriesData.IsCompleted)
                {
                    double[] samplesAtTimeT = Globals.Sensor._bufferTimeSeriesData.Take();

                    //Process data

                    // writes data to file (is it correct to do it here?)

                    // Send processed data to form to plot in a chart. HOW??

                }
            }
        }
}

class DisplayForm:Form
{
    public void DisplayDataInForm(double[] samples)
    {
        chartCh1.Series["Signal"].Points.Add(samples[1]);
        chartCh2.Series["Signal"].Points.Add(samples[2]);

        while (chartCh1.Series["Signal"].Points.Count > 1000)
        {
            chartCh1.Series["Signal"].Points.Remove(chartCh1.Series["Signal"].Points.First());
            chartCh2.Series["Signal"].Points.Remove(chartCh2.Series["Signal"].Points.First());

        }
    }
}
...