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

274 阅读2分钟

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

优化逻辑

串口配置入库

新建数据表,sysconf。字段包含data,type,intime

image.png

串口配置type:comconf data:(json格式) { "port": "COM1", "baute": "9600", "devaddr": "3" }

开机启动自动打开串口

        /// <summary>
        /// 初始化加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainFrom_Load(object sender, EventArgs e)
        {
            DataTable dt = DB_SerAPI.GetComConfFromDB();
            if (dt != null && dt.Rows.Count > 0)
            {
                Global.ComConfInfo = JObject.Parse(dt.Rows[0]["data"].ToString());
                //打开串口
                string comname = Global.ComConfInfo["port"].ToString();
                //波特率
                int baudrate = int.Parse(Global.ComConfInfo["baute"].ToString());
                //打开串口
                Global.Runport = ComPort.V_OpenPort8N1(comname, baudrate);
                if (Global.Runport == null)
                    MessageBox.Show("打开串口失败");
            }
            else
                MessageBox.Show("获取串口配置失败,请重新配置");
        }

系统配置界面逻辑修改

using Newtonsoft.Json.Linq;
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);
                    //入库
                    JObject confinfo = new JObject();
                    confinfo.Add("port",comname);
                    confinfo.Add("baute",baudrate);
                    confinfo.Add("devaddr",this.textBox1.Text);
                    DB_SerAPI.SetComConfToDB(confinfo.ToString());
                    //打开串口
                    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.comboBox2.Items.Add("4800");
            this.comboBox2.Items.Add("9600");
            this.comboBox2.Items.Add("115200");
            //默认
            if (Global.ComConfInfo != null && Global.ComConfInfo.ContainsKey("port"))
            {
                this.textBox1.Text = Global.ComConfInfo["devaddr"].ToString();
                this.comboBox2.Text = Global.ComConfInfo["baute"].ToString();
                this.comboBox1.Text = Global.ComConfInfo["port"].ToString();
            }
            //判断是否打开串口
            if (Global.Runport.IsOpen)
            {
                this.button1.Text = "关  闭  串  口";
                this.button1.BackColor = Color.DarkGray;
            }
            else
            {
                this.button1.Text = "打  开  串  口";
                this.button1.BackColor = Color.LightGreen;
            }
        }
    }
}

以上,软件打开后,会自动的打开配置的串口。需要修改的时候,再进入串口配置修改。

曲线界面的制作和实现

新增曲线界面Linewin

image.png

移植之前单页面的曲线逻辑代码

using ScottPlot;
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace THSensor
{
    public partial class DataLine : Form
    {
        /// <summary>
        /// 数据缓存
        /// </summary>
        private DataTable DataBuffer = null;
        /// <summary>
        /// 序号
        /// </summary>
        private int Index = 0;
        /// <summary>
        /// 构造
        /// </summary>
        public DataLine()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 初始化加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DataLine_Load(object sender, EventArgs e)
        {
            InitPlot();
            InitDataTable();
            this.timer1.Start();
        }
        /// <summary>
        /// 初始化曲线
        /// </summary>
        private void InitPlot()
        {
            //line
            formsPlot1.Plot.Style(Style.Seaborn);
            formsPlot1.Plot.Title("数据曲线");
            //不显示x轴
            formsPlot1.Plot.XAxis.Ticks(false);
            formsPlot1.Plot.XAxis.Line(false);
            formsPlot1.Plot.YAxis2.Line(false);
            formsPlot1.Plot.XAxis2.Line(false);
        }
        /// <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 RefreshLine()
        {
            try
            {
                if (DataBuffer.Rows.Count < 1)
                    return;
                //清空
                formsPlot1.Plot.Clear();
                //温度
                string[] data = DataBuffer.AsEnumerable().Select(d => d.Field<string>("温度")).ToArray();
                double[] ys = Array.ConvertAll<string, double>(data, s => double.Parse(s));
                //湿度
                string[] data2 = DataBuffer.AsEnumerable().Select(d => d.Field<string>("湿度")).ToArray();
                double[] ys2 = Array.ConvertAll<string, double>(data2, s => double.Parse(s));
                formsPlot1.Plot.AddSignal(ys);
                formsPlot1.Plot.AddSignal(ys2);
                formsPlot1.Refresh();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.StackTrace);
                MyLogger._.Error(ex.Message + "\r\n" + ex.StackTrace);
            }
        }
        /// <summary>
        /// 定时器回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Global.Runport.IsOpen)
            {
                byte addr = 3;
                if(Global.ComConfInfo.ContainsKey("devaddr"))
                    addr = byte.Parse(Global.ComConfInfo["devaddr"].ToString());
                //获取地址
                string ret = THSensor.ReadTHDataFromSensor(Global.Runport, addr);
                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);
                    }
                    RefreshLine();
                }
                else
                {
                    MessageBox.Show("无数据,请检查配置参数");
                }
            }
        }
    }
}

实现窗口平铺显示

修改mianwin界面

image.png

增加代码

        /// <summary>
        /// 垂直平铺
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 垂直平铺ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileVertical);
        }
        /// <summary>
        /// 水平平铺
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 水平平铺ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.LayoutMdi(MdiLayout.TileHorizontal);
        }

测试

image.png

水平平铺

image.png

垂直平铺

image.png