好了,过了这么久终于把下篇的东西准备好了,下篇我们会使用上次的串口程序做少许代码修改来制作一个4路温度采集,当然在文章最后我也会给出源代码供各位参考。
这个程序从去年开始经过了几个版本的迭代,初代代码基于MFC平台编写,后来改由WinFrom平台编写(当时解决MFC中遇到的问题我学习C#的契机之一)
虽然使用了同样的思路但是可以感受到.Net比MFC有很明显的进步,同样的代码C#构建所需要的代码量远少于C++,而已更加利于理解(也不排除我当时太菜了)
上为MFC,下为WinFrom
两代窗口界面进行对比:
上为MFC,下为WinFrom
(读取周期间隔是个Bug,已经修复了)
MFC代码写得太烂了我就不好意思放出来了,废话不多说,直接开始吧
---------------------------------------------------分割线---------------------------------------------------
一、改变窗口布局,删除发送框、接收框以及发送按钮,添加如下控件
相关控件:
1.“--”为Label控件,分别命名为:lbl_Line_1、lbl_Line_2 、lbl_Line_3 、lbl_Line_4。用来做各个通道数据的展示
2.“5秒”的周期输入框为textbox控件,命名为:txt_Cycle。用来获取用户设置的采集周期
3.条形图控件Chart,命名为:Ct_Temp
为图线增加线条(每一个序列对应一条图线,如果没做这一步会出现“数组超过索引范围”的错误):
添加表格控件,命名为:listView_Temp
并将他的属性中的View改为为Details
编辑表头:点击右上角的三角形选中“编辑列”
有两个属性需要修改,分别是Text(显示内容),Width(显示宽度)
添加定时器Timer,命名为:TimerCollect
定时器控件常用的属性为:Interval(周期),可以赋值int型数据,单位是毫秒(之前的bug就是这里忘记*1000了)
常用的方法为:start();<启动>和Stop();<停止>
将类“TempData”和类“DataServer”添加到工程中(后附文件)
声明全局变量和初始化对象 DataStr为串口接收到的数据
string DataStr;//全局变量—串口接收值
TempData Data = new TempData();
DataServer ObjData = new DataServer();
int X = 0;//图标的X轴
int Index = 0;//数据的序列号
在主程序中赋值下列代码(chart控件的绘图代码)
#region UI相关服务
private void InitChart()//初始化条形图
{
ChartArea chartArea = Ct_Temp.ChartAreas[0];
chartArea.AxisX.Minimum = 0;
chartArea.AxisX.Maximum = 10;
chartArea.AxisY.Minimum = 0d;
chartArea.AxisY.Maximum = 40d;
}
private void ShowTemp(TempData data)//显示图像
{
#region 添加图线数据
Series series1 = Ct_Temp.Series[0];
series1.ChartType = SeriesChartType.Spline;
series1.BorderWidth = 2;
series1.Color = System.Drawing.Color.Red;
series1.LegendText = "线路1";
series1.Points.AddXY(X, data.Line_1);
Series series2 = Ct_Temp.Series[1];
series2.ChartType = SeriesChartType.Spline;
series2.BorderWidth = 2;
series2.Color = System.Drawing.Color.Black;
series2.LegendText = "线路2";
series2.Points.AddXY(X, data.Line_2);
Series series3 = Ct_Temp.Series[2];
series3.ChartType = SeriesChartType.Spline;
series3.BorderWidth = 2;
series3.Color = System.Drawing.Color.Blue;
series3.LegendText = "线路3";
series3.Points.AddXY(X, data.Line_3);
Series series4 = Ct_Temp.Series[3];
series4.ChartType = SeriesChartType.Spline;
series4.BorderWidth = 2;
series4.Color = System.Drawing.Color.Yellow;
series4.LegendText = "线路4";
series4.Points.AddXY(X, data.Line_4);
#endregion
X++;
ChartArea chartArea = Ct_Temp.ChartAreas[0];
if (X > 10)
{
chartArea.AxisX.Minimum = X - 10;
chartArea.AxisX.Maximum = X;
}
if (data.Line_1 > chartArea.AxisY.Maximum || data.Line_2 > chartArea.AxisY.Maximum || data.Line_3 > chartArea.AxisY.Maximum || data.Line_4 > chartArea.AxisY.Maximum)
{
chartArea.AxisY.Maximum += 20d;
}
}
private void AddDate(TempData data, string Model)//数据表添加
{
ListViewItem List = listView_Temp.Items.Add(Index.ToString());
List.SubItems.Add(Model);
List.SubItems.Add(data.Line_1.ToString() + "℃");
List.SubItems.Add(data.Line_2.ToString() + "℃");
List.SubItems.Add(data.Line_3.ToString() + "℃");
List.SubItems.Add(data.Line_4.ToString() + "℃");
List.SubItems.Add(DateTime.Now.ToLocalTime().ToString());
listView_Temp.Items[listView_Temp.Items.Count - 1].EnsureVisible();//滚动到最后
Index++;
}
private void LineShow(TempData data)//通道数据实时显示
{
lbl_Line_1.Text = data.Line_1.ToString();
lbl_Line_2.Text = data.Line_2.ToString();
lbl_Line_3.Text = data.Line_3.ToString();
lbl_Line_4.Text = data.Line_4.ToString();
}
#endregion
在开始采集按钮中添加下列代码
if (btn_Engage.Text == "开始采集")
{
TimerCollect.Interval = Convert.ToInt16(txt_Cycle.Text)*1000;
TimerCollect.Start();
btn_Engage.Text = "停止采集";
}
else if (btn_Engage.Text == "停止采集")
{
TimerCollect.Stop();
btn_Engage.Text = "开始采集";
}
回到设计器里双击定时器为其添加响应服务:
Data = ObjData.DataAnaly(DataStr);
LineShow(Data);
ShowTemp(Data);
AddDate(Data, "自动");
ObjData.SaveDate(Index, Data, "自动");
更改串口接收事件:
按F5运行即可
----------------------------------------------分割线--------------------------------------------------------
源代码:链接: https://pan.baidu.com/s/1wZuHVKUPqMBkr8XcKu2mpg 密码: 43hq