我一直在尝试使用livecharts获得一个实时更新图表来与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);
}
}
我的问题是,我不知道该切换出什么代码来读取串行数据,而不是示例中使用的内置随机化器。这个例子没有可用的注释或解释它是如何工作的,我对编码的缺乏经验使我无法完全理解它。
我也研究过类似的问题,但大多数只是说要通读现场图表的例子。我确实理解了,但我还不够理解。如有任何协助,我们将不胜感激。
您应该让c决定数据时,而不是while(true(
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; }
}