我正在从串行端口绘制实时图表。然后我想按停止按钮。这是图表读数停止的时候。然后,当我按下“保存”按钮时,我希望在此之前绘制在图形上的值保存在Excel工作表中。
到现在为止,我可以达到我的目标,直到停止按钮为止,但是我仍然坚持保存到excel工作表部分。有人可以帮我吗?
我在Visual Studio 2015中使用Windows窗体应用程序,另外我从串行端口获取两个传感器值。
private void showchart(object sender, EventArgs e)
{
readings.Add(sensor.Substring(4,3));
readings.Add(sensor.Substring(10,3));
System.Diagnostics.Debug.WriteLine(sensor.Substring(4, 3),sensor.Substring(10,3));
chart1.Series["test1"].Points.AddXY(0, sensor.Substring(4, 3));
chart1.Series["test2"].Points.AddXY(0, sensor.Substring(10, 3));
if
((chart1.Series["test1"].Points.Count > 20) && (chart1.Series["test2"].Points.Count > 20))
{
chart1.Series["test1"].Points.RemoveAt(0);
chart1.Series["test2"].Points.RemoveAt(0);
}
chart1.Series["test1"].ChartType = SeriesChartType.Spline;
chart1.Series["test1"].Color = Color.DarkOrange;
chart1.Series["test2"].ChartType = SeriesChartType.Spline;
chart1.Series["test2"].Color = Color.DarkMagenta;
}
private void button2_Click(object sender, EventArgs e)
{
myport.Close();
myport.BaudRate = 9600;
myport.PortName = "COM8";
myport.Open();
string sensor = myport.ReadLine();
try
{
string pathfile = @"C: \Users\Raman\Desktop\Real Data\";
string filename = "real data.txt";
FileStream fs = new FileStream(pathfile + filename,FileMode.Append, FileAccess.Write);
StreamWriter s = new StreamWriter(fs);
for (int i = 0; i < readings.Count/2; i++)
{
s.WriteLine("A="+readings[2*i] + "\t" +"B="+ readings[2*i+1]);
}
MessageBox.Show("Data has been saved to" + pathfile,"Save File");
}
首先创建一个数据传输对象(DTO),以保存每行所需的信息。在这种情况下,您的班级可能看起来像这样:
public class Reading
{
public string A {get; set;}
public string B {get; set;}
public DateTime CreationDate {get;set;}
}
您的当前需求List<string> readings = new List<string>()
应该变成,Reading readings = new List<Reading>();
并且您的ShowChart
需求需要适应以使用该新的DTO。
private void showchart(object sender, EventArgs e)
{
var reading = new Reading{
A = sensor.Substring(4,3),
B = sensor.Substring(10,3),
CreationDate = DateTime.Now
};
readings.Add(reading);
var test1Series = chart1.Series["test1"];
var test2Series = chart1.Series["test2"];
System.Diagnostics.Debug.WriteLine(
"{0} {1} {2}",
reading.A,
reading.B,
reading.CreationDate);
test1Series.Points.AddXY(0, reading.A);
test2Series.Points.AddXY(0, reading.B);
if ((test1Series.Points.Count > 20) &&
(test2Series.Points.Count > 20))
{
test1Series.Points.RemoveAt(0);
test2Series.Points.RemoveAt(0);
}
// you only need this once, consider moving it to an init method
test1Series.ChartType = SeriesChartType.Spline;
test1Series.Color = Color.DarkOrange;
test2Series.ChartType = SeriesChartType.Spline;
test2Series.Color = Color.DarkMagenta;
}
您button2_click
将需要进行更改,以从中读取Reading
对象readings
并将其写入CSV文件。注意,我使用了字符串格式来调整输出的形状。我还添加了using语句,以正确关闭和处理用于写入文件的流和文件句柄。
private void button2_Click(object sender, EventArgs e)
{
try
{
string pathfile = @"C:\Users\Raman\Desktop\Real Data\";
string filename = "Data.csv";
using(FileStream fs = new FileStream(
Path.Combine(pathfile, filename),
FileMode.Append,
FileAccess.Write))
{
using(StreamWriter s = new StreamWriter(fs))
{
foreach(var reading in readings)
{
// format the output
s.WriteLine(
"{0:yyyy-MM-dd hh:mm:ss},{1},{2}",
reading.CreationDate,
reading.A,
reading.B
);
}
}
MessageBox.Show("Data has been saved to" + pathfile,"Save File");
}
}
catch(Exception exp)
{
MessageBox.Show(exp.Message,"Error");
}
}
运行此命令时,您将在数据文件中看到:
2016-06-18 09:06:56,ValueFromA,ValueFromB
2016-06-18 09:18:39,AnotherValueFromA,AnotherValueFromB
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句