Livechart WPF, как читать последовательный ввод (C#) - PullRequest
0 голосов
/ 04 марта 2020

Я пытался заставить живую диаграмму обновления работать с WPF, используя живые диаграммы, моя цель - обновить диаграмму, поскольку она считывает последовательный ввод с Arduino, который просто дает некоторые числа.

Используя этот пример: https://lvcharts.net/App/examples/v1/wpf/Constant%20Changes

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

Я прочитал последовательный вход, подобный этому:

private void Button_Serial_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(SerialThread);

            thread.Start();
        }

        static SerialPort _serialPort;

        private void SerialThread() //serial thread starts here
        {
            _serialPort = new SerialPort();
            _serialPort.PortName = "COM3";//Set your board COM
            _serialPort.BaudRate = 9600;


            try
            {
                _serialPort.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine("could not connect to serial");
            }

            while (true)
            {
                string serialMSG = _serialPort.ReadExisting();
                Console.WriteLine(serialMSG);
                Thread.Sleep(200);
            }
        }

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

Я смотрел на подобные проблемы, но большинство просто говорит, что читал примеры из живых диаграмм. Ну, я сделал, но я все еще не понимаю этого достаточно. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 марта 2020

Вместо while (true) вы должны указать c#, который вы определили, когда данные

    class Program
    {
        private static SerialPort port = new SerialPort("COM3",
                     9600, Parity.None, 8, StopBits.One);

        private static ChartValues<MeasureModel> _chartValues;

        static void Main(string[] args)
        {

            SerialPortWorker();       

            Console.Read();
        }

        private static void SerialPortWorker()
        {
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); //called when the data waiting in the buffer

            port.Open(); //// Begin communications 

            Console.ReadLine(); // keep console thread alive
        }

        private static void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if(port.BytesToWrite > 0)
            {
                var data = port.ReadExisting(); //read incoming data

                _chartValues.Add(new MeasureModel
                {
                    DateTime = DateTime.Now,
                    Value = data
                });

                SetAxisLimits(now);

                //lets only use the last 150 values
                if (ChartValues.Count > 150) ChartValues.RemoveAt(0);
            }
        }


    }




  class MeasureModel
    {
        public DateTime DateTime { get; set; }
        public String Value { get; set; }
    }
...