从0开始的WinForm串口+4路温度采集(下)

      好了,过了这么久终于把下篇的东西准备好了,下篇我们会使用上次的串口程序做少许代码修改来制作一个4路温度采集,当然在文章最后我也会给出源代码供各位参考。

这个程序从去年开始经过了几个版本的迭代,初代代码基于MFC平台编写,后来改由WinFrom平台编写(当时解决MFC中遇到的问题我学习C#的契机之一)

虽然使用了同样的思路但是可以感受到.Net比MFC有很明显的进步,同样的代码C#构建所需要的代码量远少于C++,而已更加利于理解(也不排除我当时太菜了)

上为MFC,下为WinFrom

112106_CAPj_2810362.png

 

110400_AZKL_2810362.png

两代窗口界面进行对比:

上为MFC,下为WinFrom

110417_0ngV_2810362.png

110437_jUQM_2810362.png

(读取周期间隔是个Bug,已经修复了)

MFC代码写得太烂了我就不好意思放出来了,废话不多说,直接开始吧

---------------------------------------------------分割线---------------------------------------------------

一、改变窗口布局,删除发送框、接收框以及发送按钮,添加如下控件

110615_KQLb_2810362.png

相关控件:

1.“--”为Label控件,分别命名为:lbl_Line_1、lbl_Line_2 、lbl_Line_3 、lbl_Line_4。用来做各个通道数据的展示

2.“5秒”的周期输入框为textbox控件,命名为:txt_Cycle。用来获取用户设置的采集周期

3.条形图控件Chart,命名为:Ct_Temp

110731_Q6jo_2810362.png

为图线增加线条(每一个序列对应一条图线,如果没做这一步会出现“数组超过索引范围”的错误):

110742_G5WM_2810362.png

110755_l4uJ_2810362.png

添加表格控件,命名为:listView_Temp

110809_9st2_2810362.png

并将他的属性中的View改为为Details

110823_Yj5g_2810362.png

编辑表头:点击右上角的三角形选中“编辑列”

110844_3Drj_2810362.png

有两个属性需要修改,分别是Text(显示内容),Width(显示宽度)

110852_0dcu_2810362.png

添加定时器Timer110913_kLNO_2810362.png,命名为:TimerCollect

定时器控件常用的属性为:Interval(周期),可以赋值int型数据,单位是毫秒(之前的bug就是这里忘记*1000了)

常用的方法为:start();<启动>和Stop();<停止>

将类“TempData”和类“DataServer”添加到工程中(后附文件)

声明全局变量和初始化对象 DataStr为串口接收到的数据

110945_hLgN_2810362.png

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, "自动");

更改串口接收事件:

111159_8V9p_2810362.png

按F5运行即可

111212_xrie_2810362.png

----------------------------------------------分割线--------------------------------------------------------

源代码:链接: https://pan.baidu.com/s/1wZuHVKUPqMBkr8XcKu2mpg 密码: 43hq

转载于:https://my.oschina.net/viperli/blog/1801451

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值