c# 从0实现一个温湿度监测的小工具 (10)

344 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

本章节将实现系统配置功能,和实时数据查看,下一节介绍历史数据的查询

关于界面

关于见面简单的显示联系方式,和版本号

using System;
using System.Windows.Forms;

namespace THSensor
{
    public partial class About : Form
    {
        /// <summary>
        /// 初始化
        /// </summary>
        public About()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void About_Load(object sender, EventArgs e)
        {
            this.richTextBox1.Text = "版本:V1.0.0";
            this.richTextBox1.ReadOnly = true;
        }
    }
}

系统配置

实现系统配置界面逻辑

系统配置主要实现对串口的配置,我们根据之前的窗口逻辑,copy过来

using System;
using System.Drawing;
using System.Windows.Forms;

namespace THSensor
{
    public partial class Sysconf : Form
    {
        /// <summary>
        /// 串口口配置类
        /// </summary>
        public Sysconf()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try 
            {
                if (Global.Runport.IsOpen)
                {
                    Global.Runport.Close();
                    MessageBox.Show("串口已关闭");
                    this.button1.Text = "打  开  串  口";
                    this.button1.BackColor = Color.LightGreen;
                }
                else
                {
                    //串口
                    string comname = this.comboBox1.Text;
                    //波特率
                    int baudrate = int.Parse(this.comboBox2.Text);
                    //打开串口
                    Global.Runport = ComPort.V_OpenPort8N1(comname, baudrate);
                    if (Global.Runport != null)
                    {
                        MessageBox.Show("打开串口成功");
                        this.button1.Text = "关  闭  串  口";
                        this.button1.BackColor = Color.DarkGray;
                    }
                    else
                        MessageBox.Show("打开串口失败");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.StackTrace +"\r\n"+ ex.Message);
            }
        }
        /// <summary>
        /// 加载函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Sysconf_Load(object sender, EventArgs e)
        {
            //扫描串口
            string[] comlist = ComPort.V_ScanPort();
            if (comlist.Length < 1)
            {
                MessageBox.Show("没有扫描到串口,请检查硬件连接");
                return;
            }
            else
            {
                foreach (string name in comlist)
                {
                    this.comboBox1.Items.Add(name);
                }
                //默认
                this.comboBox1.Text = comlist[0];
            }
            //波特率初始化
            this.comboBox2.Items.Add("4800");
            this.comboBox2.Items.Add("9600");
            this.comboBox2.Items.Add("115200");
            //默认
            this.comboBox2.Text = "9600";
            //默认地址
            this.textBox1.Text = "03";

            Global.DevAddr = byte.Parse(this.textBox1.Text);
        }
    }
}


实时数据查看

实现表格显示窗口

新建文件夹 Datashow 和子文件夹 datagride
创建datagride窗口类,用来显示表格化的数据
具体的实现逻辑,参考之前的代码,拖入一个表格显示类,docker属性设置为fill

using System;
using System.Data;
using System.Windows.Forms;

namespace THSensor
{
    public partial class DataGride : Form
    {
        /// <summary>
        /// 数据缓存
        /// </summary>
        private DataTable DataBuffer = null;
        /// <summary>
        /// 序号
        /// </summary>
        private int Index = 0;
        /// <summary>
        /// 构造
        /// </summary>
        public DataGride()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 初始化结构
        /// </summary>
        private void InitDataTable()
        {
            DataBuffer = new DataTable();
            DataBuffer.Columns.Add("ID");
            DataBuffer.Columns.Add("温度");
            DataBuffer.Columns.Add("湿度");
            DataBuffer.Columns.Add("时间");
        }
        /// <summary>
        /// 初始化表格
        /// </summary>
        private void InitDataGrid()
        {
            //自适应列宽
            dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
            //绑定数据到DataGridView
            dataGridView1.DataSource = DataBuffer;
            //不显示最后一个行
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.ReadOnly = true;
            //去除首列
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.Columns["ID"].HeaderText = "序号";
            dataGridView1.Columns["温度"].HeaderText = "温度";
            dataGridView1.Columns["湿度"].HeaderText = "湿度";
            dataGridView1.Columns["时间"].HeaderText = "时间";
            //刷新
            dataGridView1.Refresh();
        }
        /// <summary>
        /// 定时器回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Global.Runport.IsOpen)
            {
                //获取地址
                string ret = THSensor.ReadTHDataFromSensor(Global.Runport,Global.DevAddr);
                if (!string.IsNullOrEmpty(ret))
                {
                    string temp = ret.Split('&')[0];
                    string humi = ret.Split('&')[1];
                    //入库操作
                    DB_SerAPI.SaveTHData(temp, humi);
                    //刷新列表
                    string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    if (DataBuffer != null)
                    {
                        Index++;
                        DataRow row = DataBuffer.NewRow();
                        row["ID"] = Index.ToString();
                        row["时间"] = time;
                        row["温度"] = temp;
                        row["湿度"] = humi;
                        DataBuffer.Rows.Add(row);
                    }
                }
                else
                {
                    MessageBox.Show("无数据,请检查配置参数");
                }
            }
        }
        /// <summary>
        /// 加载函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataGride_Load(object sender, EventArgs e)
        {
            //初始化数据
            InitDataTable();
            InitDataGrid();
            
            this.timer1.Start();
        }
    }
}

侧边栏点击实现打开窗口

侧边栏实现的是双击打开回调

         /// <summary>
        /// 双击回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            string selname = this.treeView1.SelectedNode.Text;
            //MessageBox.Show(selname);
            switch (selname)
            {
                case "实时数据":
                    OpenDataGrideWin();
                    break;
                case "历史数据":
                    MessageBox.Show("TDO");
                    break;
                case "数据报表":
                    MessageBox.Show("TDO");
                    break;
                default:
                    break;
            }
        }
        /// <summary>
        /// 打开表格显示窗口
        /// </summary>
        private void OpenDataGrideWin()
        {
            if (!IsWinOpened("GrideWin"))
            {
                DataGride realwin = new DataGride();
                realwin.MdiParent = this;
                realwin.Name = "GrideWin";
                realwin.WindowState = FormWindowState.Maximized;
                realwin.Show();
            }
        }
        /// <summary>
        /// 判断窗体是否打开
        /// </summary>
        /// <param name="name">窗体名称</param>
        /// <returns></returns>
        private bool IsWinOpened(string name)
        {
            foreach (Form frm in this.MdiChildren)
            {
                if (frm.Name == name)
                {
                    frm.Focus();
                    frm.WindowState = FormWindowState.Maximized;
                    return true;
                }
            }
            return false;
        }

测试

打开串口

image.png

打开实时表格显示

image.png

最大化窗口

image.png

如此便可以实现一个可以自适应分辨率的工具。 下一章节实现曲线显示&历史数据查询。并优化代码结构。提取一个显示基类